Step by Step Skeletal Animation in C++ and OpenGL, Using COLLADA PART 2

Level: Beginner to Intermediate

Before you start reading the implementations part, if you haven’t read the first part of this tutorial(s), which explains COLLADA documents in detail, you should follow the link below.

Part 1: COLLADA documents

You should have seen the following structure. In part 1

1)     Reading and Understanding COLLADA documents. (high level overview of COLLADA)

2)     Actual Implementations in C++ using OpenGL, of what we learn in Part 1

The one that your are reading now is the second part which has further two parts,

1)     Implementation part related to the Exporter for COLLADA

2)     Implementation part related to the skeletal animation in C++ using OpenGL

As far as the implementation of skeletal animation is concerned, we will Use OpenGL and C++, but the exporter which is used to export Data from COLLADA documents into my own Binary format (.CBA), I have written in C# (C Sharp). I could have written that in C++, but I was too lazy to write my own implementation of XML readers, while C# has very good implementation for that. And the free API for XML parsing (tinyXML) has a lot of issues which I was not really ready for. So I wrote my COLLADA exporter in C# and I create my binary file format which I call CBA files, from my exporter. CBA means COLLADA Binary Assets 🙂 and later I import this file in C++ using a CBA reader API. Now this introduced a lot of problems for me, like I have to maintain almost similar code twice once in C# for my exporter and Once in C++ for my importer. So it would be better that you don’t use my exporter and write your own Exporter in what ever language you prefer. And that would also help you understand the COLLADA documents in depth.

Part 2.1:

Implementation of Exporter for COLLADA, written in C#

Implementation of Skeletal Animation in COLLADA documents

As we have discussed in the introduction part, this tutorial is split in to two parts, I assume you have already read first one general introduction to COLLADA documents which is irrespective of any programming language Part 1: COLLADA documents.  Now we would define the structure in which we can read the COLLADA document. Please bear in mind that this exporter which I have written in C# is one of my worst ever codes, I wrote everything very quick and didn’t had any time to plan and design before code. So you will see a lot of hacks every where 🙂 but it is of course recommended that you write your own exporter. One other thing you should remember is that, this part of part 2 will try to read the COLLADA document but will not change the structure (schema) of the data; every thing is read as it is from COLLADA, and when we will write our custom format out of it, we will just read those things which are really necessary.

Reading Geometry Data from COLLADA document
Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<library_geometries>

<geometry>

<mesh>

<souce>

<technique_common>

<float_array> and <NAME_array>

<accessor>

<param>

<triangles>

<vertices>

<input>

<p>

Now you might know that some of the nodes are part of the Core COLLADA, which means, that they can appear in many places and many libraries in COLLADA. So you should define a structure for those nodes with common names so that they can be used for all kinds of purposes, for example a <source> node can be used for Vertices, Animation, Texture Coordinates and Vertex Weights or any other kinds of data. This is something that I forgot in my C# implementation, and later I was not able to re-factor 🙂 Remember my hacky bits of code :).

So if I were to define a class in which I can read the Geometry data of a COLLADA document I would do something like follows.

class COLLADA
{
private:
    GeometryLibrary    m_GeometryLibrary;
};
 

Where GeometryLibrary would be defined as follows.

 
class GeometryLibrary
{
    Vector<Geometry>    m_Geometries;
};
 
And now we define Geometry as follows.
 
class Geometry
{
    Mesh                m_Mesh;
};

The rest of the Libraries are not important at this point so we will not discuss them. All the other types of classes which are needed to store different nodes from COLLADA are listed as follows. And this is the simplest implementation you can make. I am not considering optimizations and inheritance etc. and there might be a lot of opportunities for restructuring and optimizations. For example as we know a source can have one type of array node, which could be <float_array>, <NAME_array> or any other type of array, in my implementation I am using different classes for each, you might want to create one class called Array or BaseArray and then derive each type of Array from it with specialize values.

//----------------------------------------------//
class Float_Array
{
    unsigned int        m_Count;
    string              m_ID;
    float               *m_Floats;
};
//----------------------------------------------//
class Name_Array
{
    unsigned int        m_Count;
    string              m_ID;
    string              *m_Names;
};
//----------------------------------------------//
class Param
{
    string              m_Name;
    string              m_Type;
};
//----------------------------------------------//
class Accessor
{
    string              m_Source;
    unsigned int        m_Count;
    unsigned int        m_Stride;
    Vector<Param>       m_Params;
};
//----------------------------------------------//
class Technique_Common
{
    Accessor            m_Accessor;
};
//----------------------------------------------//
class Source
{
    string              m_ID;
    Float_Array         m_Float_Array;
    Name_Array          m_Name_Array;
    Technique_Common    m_TechniqueCommon
};
//----------------------------------------------//
class Input
{
    string              m_Semantic;
    string              m_Source;
    string              m_Offset;
    string              m_Set;
};
//----------------------------------------------//
class Vertices
{
    string              m_ID;
    Vector<Input>       m_Inputs;
};
//----------------------------------------------//
class P
{
    unsigned int         m_Count;
    unsigned short       *m_Indices;
};
//----------------------------------------------//
class Triangles
{
    unsigned int        m_Count;
    string              m_Material;
    Vector<Input>       m_Inputs;
    P                   m_P;
};
//----------------------------------------------//
class Mesh
{
    Vector<Source>      m_Sources;
    Vertices            m_Vertices;
    Vector<Triangles>   m_Triangles;
};
//----------------------------------------------//

Now using those files we will store the Geometry data from COLLADA documents in a COLLADA Class Object. How you can read all those nodes is another story, you can either use C#’s XML parsers or use TinyXML or any other XML parser to load and parse COLLADA documents, you can also write your own XML parser if you have enough time. But I would suggest using an existing one rather writing your own, since the goal is to read COLLADA documents not XML files.

By now you should have all the Data related to displaying the model in 3D scene, you can start from <triangles> node and render all the triangles using OpenGL.

Reading Texture filename from COLLADA document

Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<library_images>

<image>

<init_from>

Its all again up to you how you want to read the texture file name, once you know where to find it. In the simplest form I would create a class for LibraryImages as well in the COLLADA Class and read the <image> in to it and so on. So the refined implementation for Class COLLADA will become as follows.

class COLLADA
{
private:
    GeometryLibrary     m_GeometryLibrary;
    ImagesLibrary       m_ImagesLibrary;
};
 

Where ImagesLibrary would be defined as follows.

 
class ImagesLibrary
{
    Vector<Image>       m_Images;
};
 
And now we define Image as follows.
 
class Init_From
{
    string              m_Filename;
};
 
class Image
{
    Init_From           m_Init_From;
};
Reading Materials from COLLADA document
Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<triangles>

<library_materials>

<material>

<instance_effect>

<library_effects>

<effect>

<phong> or <blin>

<profile_COMMON>

<technique>

<ambient>

<diffuse>

<specular>

<emission>

<shininess>

<transparency>

<color>

If you have read the previous sections of this part 2, and introduction part for this section you should be able to define the structure for this section by yourself, so I will not discuss it, since its getting repeated.

Reading Skeleton from COLLADA document
Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<library_visual_scenes>

<node>

<instance_controller>

<skeleton>

<visual_scene>

<matrix>

In the introduction part we discussed how to read the skeleton from <visual_scene> so I assume you should be able to define the structure for reading that data. But I used another approach myself. Which I think is the simplest way of reading Skeleton from COLLADA documents. And before discussing that, you need to read the next section in the introduction part.

Reading Skinning information from COLLADA document
Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<library_controllers>

<controller>

<skin>

<source>

<param>

<accessor>

<technique_common>

<NAME_array>

<float_array>

<node>.

<vertex_weights>

<input>

<vcount>

<v>

What I do for reading the skeleton from COLLADA documents is that I read the <controller>, and for all the Bone SIDs I check in the Visual Scene and find his parent and Joint Matrix, there, and I read the Inverse Bind matrix from the <controller>. And that’s all what we need. As you might remember we took an assumption that all the joints must be attached to the skin. In that case you don’t have to read the <instance_controller> node in the <visual_scene> and you can read Bone IDs from <controller> and find them in <visual_scene>. It require a little work to find the node in <visual_scene> and find his parent etc, but once you have started working with COLLADA nodes it should not be hard for you.

Reading Animation data from COLLADA document
Click here to go to: Implementation section in Part 1 for this section of Part 2

In the introduction section of part 1, we discussed the following libraries and nodes which are related to this section and which will be parsed and used,

<library_animations>

<animation>

<source>

<sampler>

<channel>

<visual_scene>

By now you should be quite an expert to define the structure for loading this data into it. But I would also give you a hint. Your COLLADA Class should look as follows, after reading all those sections.

class COLLADA
{
private:
    GeometryLibrary     m_GeometryLibrary;
    ImagesLibrary       m_ImagesLibrary;
    EffectsLibrary      m_EffectsLibrary;
    MaterialLibrary     m_MaterialLibrary;
    ControllerLibrary   m_ControllerLibrary;
    AnimationLibrary    m_AnimationLibrary;
    VisualSceneLibrary  m_VisualSceneLibrary;
};
 

Where AnimationLibrary would be defined as follows and all the other libraries must have been defined by you.

 
class AnimationLibrary
{
    Vector<Animation>   m_Animations;
};
 
And now we define Animation as follows.
 
class Animation
{
    string              m_ID;
    Vector<source>      m_Sources;
    Vector<sample>      m_Samples;
    Vector<channel>     m_Channels;
};

And now you should be able to define “sample” and “channel” classes. You can also write a structure where you do some other processing already on these <animation> nodes, and only keep the list of channels, where you reference the sampler targeted by this channel and then in “sample” you save references to the <sources> that are targeted or used by that sample. This processing we have to do sooner or later so it’s your choice when and where you want to do it. But as we discussed in the beginning of this part, that we will not change the structure of COLLADA but read as it is so you might not want to do it now.

Please not that I am not giving you actual code for reading from COLLADA documents, since that depends on what language you use to read XML files. If you have read the first part of these tutorials and you have created the structure properly, you should be able to read the data very easily using any XML parser. So I will not go in that much detail of implementation. And will let you do the job yourself.

Once we have finished reading the COLLADA document, we are ready to write the CBA file, which will be explained in the following section, in case you don’t want to write CBA file you can write your own “what ever” format and then read it accordingly.

CBA file format

The CBA file format is a very easy and simple to read and write file format. Geometry and skeletal data i.e. Vertex Weights etc, is saved in index form, which means, the whole data is saved once in a long floats array and then that float array is referenced with indices from the places where the data is needed. This saves space when you don’t want to save repeated vertex attributes for example. In a typical 3D model one vertex can be used by many triangles, and instead of saving that vertex many times for each triangle, its better to save it once and save its index for each triangle. That’s how all the data is saved in COLLADA and CBA file will use the same structure since it saves a lot of space as well as sending this data to OpenGL is also easy and efficient.

The CBA file format header

You can see in figure 1, how the header for CBA file looks.

Figure 1: Header of CBA file 

The structure of the header, 96 bytes in total, in source code is as follows

class CCBAHeader  

{

public:

     // CBA Main Chunk contains information about all other chunks (32 Bytes in Total)

     class CCBAMainChunk

     {

     public:

          unsigned int  m_MagicNumber;               // Always CBA0

          unsigned int  m_ChunkID;                   // Must be 0 

          unsigned int  m_Version;                   // Version initial 1, In this version only supports GeometryChunk

          unsigned int  m_NoOfSubChunks;             // Total Number of Chunks

          unsigned int  m_HasAnimation_HasSkeleton;  // LowBytes = Animation, HighBytes = Skeleton

          unsigned int  m_FirstChunkOffset;          // From where does the First Chunk Starts

          unsigned int  m_FileSize;                  // Total number of Bytes in the File

          unsigned int  m_ExtraData;                 // Can be any number of Bytes after this bytes

     };

    

// Contains the Bind Position Geometry Data in CBA (40 Bytes in Total)

     class CCBAGeometryChunk

     {

     public:

          unsigned int  m_TotalNoOfTriangles;        // Total Triangles

          unsigned int  m_ChunkID;                   // Must be 1 

          unsigned int  m_NoOfTriangleGroups;        // Number of Triangle Groups Categorized by Material

          unsigned int  m_TrianglesDetails;          // 1 = Only Vertices, 2 = Vertices + Normals, 3 = Vertices + Normals + TextureCoords

          unsigned int  m_DataOffset;                // Actual Data Starts from this Offset

          char          m_TextureFileName[20];       // Texture files name (.jpg,.png,.tga,.bmp)  

     };

 

     // Contains the Animation Data in CBA (24 Bytes in Total)

     class CCBAAnimationChunk

     {

     public:

          unsigned int  m_NoOfAnimations;            // Total Animations Keyframes

          unsigned int  m_ChunkID;                   // Always 2

          unsigned int  m_NoOfKeyframes;             // Total Animations Keyframes

          float         m_StartTime;                 // Start Time of the animation

          float         m_TotalTime;                 // End time or total time of the animation

          float         m_FramesPerSecond;           // Frames Per second to render

     };

 

private:

     CCBAMainChunk      m_MainChunk;                // The Main Chunk of CBA file

     CCBAGeometryChunk  m_GeometryChunk;            // The Geometry Chunk of CBA file

     CCBAAnimationChunk m_AnimationChunk;           // The Animation Chunk of CBA file

};

Immediately, after the header is finished, the actual data of the CBA file format starts.

Figure 2: Data section of CBA file

As you can see the data section of the CBA file format is very simple. The first four elements are the 4 arrays we need which are saved in index form.

First one is the Vertices data, which says number of vertices in a 4 byte integer, and the actual data in 4 byte floats array.

Second one is the Normals data, which says number of Normals in a 4 byte integer, and the actual data in 4 byte floats array.

Third one is the Texture Coordinates data, which says number of Texture Coordinates in a 4 byte integer, and the actual data in 4 byte floats array.

Fourth one is the Vertex weights data, which says number of Vertex Weights in a 4 byte integer, and the actual data in 4 byte floats array.

After that we have the triangle group’s data, we already know how many triangle groups we have from the header so for each triangle group we save its number of triangles in a 4 bytes unsigned integer and second we save its material which is 4, 4 component vectors and 2 floats. In total 72 bytes for material. After that we save the triangles indices for each triangle, which are 3 unsigned shorts (1 for each vertex) per each attribute. So for a triangle which specifies Vertex, Normal and Texture Coordinate, we save 3 * 3 = 9 indices.

After the triangles data we write the Skeleton data, first we write the bind shape matrix for the skeleton. Then for each Joint we write its Parent ID, Joint Matrix, (which is called Bind matrix in the figure) and its inverse bind matrix. Remember we are not writing the Bone ID itself, in the skeleton, which can be considered as the number/index of the bone we read, so the first bone we read gets an ID of 0, the second one gets an ID of 1 and so on.

After the skeleton we have the weighted vertices data. For each vertex from the vertices source in the Geometry data section, we have to specify its weight towards any bone. So for each vertex we write the number of bones affecting this vertex, and then for each bone affecting this vertex, we write the Joint ID/Bone ID and the weight towards that bone.

And at the end we write the Animations key frame data. As you might have noticed that the animation nodes are targeting Joints from the skeleton and this was one of our assumptions that only skeletal animation is supported and not backed animations or vertex animation. So for each Bone/Joint targeted by the animations from the library animations we write it’s Bone ID and then its number of key frames, which consists of “time” and a Joint Matrix, which is called “transform” in the figure.

And that’s the whole CBA file format. In the next part you will learn how to create this Character in OpenGL scene that we saved in CBA files, how to connect it to the skeleton and how to animate it.

Part 2.2:

Implementation part; skeletal animation in C++ using OpenGL

Implementation of Skeletal Animation in C++

At last we are here 🙂 for which we were waiting. This part of the tutorials is the most important of all the other parts we have read so far. We will first try to write the implementation for loading the CBA file that we wrote before in C#. You can also download this CBA loading API from downloads section of this website.

The API has a CCBA class which handles loading and displaying of the CBA files, which looks like follows.

class CCBA
{
public:
      CCBA(void);
      ~CCBA(void);
 
      // Some of the Functions are excluded from this text for the sake of simplicity
        void      Draw();
        bool      Update(unsigned long a_MiliSeconds);
        void      SetupSkeleton(int a_Frame);
        void      SetupBindPose();
        void      ReadCBA(string a_FileName);
    
protected:
        void      ReadHeader(CExport *a_File, string a_FileName);
        void      ReadArray(CExport *a_File, float **a_Destination,unsigned int &a_Size);
        void      ReadTriangles(CExport *a_File);
        void      ReadSkeleton(CExport *a_File);
        void      ReadAnimations(CExport *a_File);
 
        void      WriteCBA(string a_FileName);
        
        void      CalculateBound();
        void      ConvertToArrays();
 
    private:
        // Only the most important member variables are shown here 
        CCBAHeader                 *m_Header;             // Header (Contains information about the file)
        CGeometryData              *m_GeometryData;       // Common data in the Mesh (List of Vertices/Normals/TexCoords)
        CSkeletonData              *m_SkeletonData;       // Skeleton Data used for animation
        Vector<CTriangleGroup*>    *m_TrianglesGroups;    // Individual Triangle Groups Separated By Material Data (Just Indices and Material)
    };
 

In the CCBA class the most important member variables are m_Header, m_GeometryData, m_SkeletonData and m_TriangleGroups the rest of the stuff is provided for the sake of completeness. As the names suggests, m_Header contains the Header, m_GeometryData will contain the Geometry of the Character, m_SkeletonData will contain the Joints Hierarchy, and m_TriangleGroups contains all the Triangle groups which are separated by Material, by the COLLADA Exporter from StudioMax.

 

The ReadCBA function of CCBA class looks like this.

 

void CCBA::ReadCBA( string a_FileName )
{
    CExport *File = new CExport(0,a_FileName);
 
    this->ReadHeader(File, a_FileName); // Read Header
    this->ReadArray(File, &this->m_GeometryData->m_VerticesArray, this->m_GeometryData->m_VerticesArraySize); // Read Points
    this->ReadArray(File, &this->m_GeometryData->m_NormalsArray, this->m_GeometryData->m_NormalsArraySize); // Read Normal
    this->ReadArray(File, &this->m_GeometryData->m_TextureCoordsArray, this->m_GeometryData->m_TextureCoordsArraySize); // Read Texture Coordinates
 
    if (65536 & this->m_Header->m_MainChunk.m_HasAnimation_HasSkeleton)
        this->ReadArray(File, &this->m_GeometryData->m_VertexWeightsArray, this->m_GeometryData->m_VertexWeightsArraySize);// Read Weights Data
 
    this->ReadTriangles(File); // Read Triangles Data
 
    if (65536 & this->m_Header->m_MainChunk.m_HasAnimation_HasSkeleton)
    {
        this->ReadSkeleton(File); // Read Skeleton Data
        this->ReadAnimations(File); // Read Animations Data
        this->SetupInverseBindAttributes(); // Extra Processing for setting up for Skinning
    }
 
    delete File;
    
    this->ReadClipsInformation(a_FileName); // Read Animation Clips
 
    this->CalculateBound(); // Calculates Bounding Sphere
 
    if (this->m_Header->m_MainChunk.m_Version == 1) // CBA Version 1 is changed to 2
    {
        this->ConvertToArrays();
        this->WriteCBA(a_FileName);
        this->DuplicateSkinnedData();
    }
    else
        this->DuplicateBackupData();
 
    this->FillVertexBufferObject(); // Makes it Ready to be rendered 
    this->FillIndexBufferObject();  // Makes it Ready to be rendered
    this->SetupTexture(); // Sets up Texture and loads
}

You can see that the function is quite simple; it’s just reading the sections that we discussed before. For example it reads header, and all arrays, and then reads Triangles etc. One thing that I would like to explain here is that the exporter that we discussed before write a CBA version 1.0, which means all the data is saved as it is as we read from COLLADA. In ReadCBA function we check if the CBA version is 1.0 then we convert it to CBA Version 2.0. And before doing that, ConvertToArrays() is called, which takes all the arrays from CBA and makes them ready to be used with OpenGL Vertex Buffers and Index Buffers. The Difference between these two types is that, for example we have one triangle in COLLADA and it has 3 Attributes per vertex. So each vertex of a triangle in COLLADA has 1 Index per Attribute, and 3 indices for 3 attributes. While OpenGL Vertex Buffers can only read One Index per vertex for any number of attributes. For that purpose we have to do some extra processing on the data arrays to shuffle them so that each vertex used in a triangle has same Index for all its attributes from the attributes sources. And then we resave this new CBA file as Version 2.0. If you don’t understand this process, then don’t worry and keep on reading because you need this step only if you want to render the mesh using OpenGL vertex and index buffers. If you want to render everything in immediate mode then you don’t have to worry about that.

The rest of the functions are self explanatory, each one of them reads the corresponding section from CBA files, and if I try to explain each and every one of them separately it will easily get very boring.

The main purpose of ReadCBA is to read the CBA file and fill the data structures that we created for saving the Character data. We have already discussed the header structure of CBA file. Now we will discuss the rest of the data structures that we save.

CGeometryData	*m_GeometryData;       // Common data in the Mesh (List of Vertices/Normals/TexCoords)

CGeometryData class contains all the Data that we need for the Character other then Skeleton and Animations data. And it looks like follows.

class CGeometryData

{

public:

     CGeometryData(void);

     ~CGeometryData(void);

     //Functions for this class are removed

private:

     float                        *m_VerticesArray;                     // All the Vertices

     float                        *m_SkinnedVerticesArray;              // All the Skinned Vertices

     float                        *m_NormalsArray;                      // All the Normals

     float                        *m_SkinnedNormalsArray;               // All the Skinned Normals

     float                        *m_TextureCoordsArray;                // All the Texture Coordinates

     float                        *m_VertexWeightsArray;                // All the Vertex Weights

     Vector<CVertexInfluence*>    *m_VertexInfluences;                  // Vertices Influences

 

     unsigned int                 m_VerticesArraySize;

     unsigned int                 m_NormalsArraySize;

     unsigned int                 m_TextureCoordsArraySize;

     unsigned int                 m_VertexWeightsArraySize;

};

We will read all the Vertices, Normals, Texture coordinates and Vertex Weights arrays in this m_GeometryData pointer. If you see we also have Duplicated copies of both the Vertices array and Normals array. These copies are used during skinning and will be explained later. Since the Vertex Texture coordinates and vertex weights never change during skinning, we don’t need copies of them.

Apart from all that, we have a list of CVertexInfluence pointers for each model. This is the list where we save the data regarding which bone is influencing which vertex with how much weight. The structure of CVertexInfluence is as follows.

class CVertexInfluence

{

public:

     CVertexInfluence(void);

     ~CVertexInfluence(void);

 

private:

     unsigned int       m_NoOfInfluences;      // Total Number of Influences

     unsigned int       *m_Weights;             // Weights Array

     int                *m_Joints;              // Joints Array

};

 

The next thing in CCBA is;

 
CSkeletonData           *m_SkeletonData;       // Skeleton Data used for animation
 
This is where the skeleton data is saved and the structure of the CSkeletonData is as follows.

 

class CSkeletonData

{

public:

     CSkeletonData(void);

     ~CSkeletonData(void);

 

private:

     unsigned int  m_NoOfBones;          // Total Number of Joints in Skeleton

     unsigned int  m_NoOfKeyframes;      // Another Copy of the No Of Key frames of animation

     CMatrix4f     *m_BindShapeMatrix;   // Bind Shape Matrix

     CBone         **m_Bones;            // All the bones

     CBone         *m_RootBone;          // Root bone reference to one of the Bone in the m_Bones

};

Here we save all the bones and the bones contain the hierarchy information. We have the Bind Shape Matrix, and a bone count. How each bone is structures is as follows.

class CBone

{

public:

     CBone(void);

     ~CBone(void);

private:

     int           m_ID;                  // ID of this bone

     int           m_ParentID;            // Parent ID of this bone

     CMatrix4f     *m_JointMatrix;        // The Bind Pose Matrix

     CMatrix4f     *m_InverseBindMatrix;  // The Inverse Bind Pose Matrix

     CMatrix4f     *m_WorldMatrix;        // The World Matrix

     CMatrix4f     *m_SkinningMatrix      // The Matrix Used for calculations

     unsigned int  m_ChildCount;          // Number of Children

     Vector<int>   *m_Children;           // Children of this bone

     unsigned int  m_NoOfKeyframes;       // No Of key frames of animation for this bone

     CKeyframe     **m_Keyframes;         // All Key frames for this Bone’s animation

};

Here we have the Bone ID, Parent Bone ID, Joint Matrix, Inverse Bind Matrix, all the Child bone IDs and all the key frames for this bone. World Matrix and Skinning Matrix are created and changed at run time when we run the animation, so they are just convenience buffers. Each key frame is a pair of Transformation (Joint Matrix) and time.

class CKeyframe

{

public:

     CKeyframe(void);

     ~CKeyframe(void);

 

private:

     float          m_Time;                // Time of this key frame

     CMatrix4f      *m_Transform;          // Transformation of this Key frame

};

 

The next very important thing in CCBA is;

 
Vector<CTriangleGroup*> *m_TrianglesGroups;// Individual Triangle Groups Separated By Material Data (Just Indices and Material)
 
The Structure of a CTriangleGroup is as follows.
 
class CTriangleGroup

{

public:

CTriangleGroup(void);

     ~CTriangleGroup(void);

 

     // The functions for this class are removed

 

private:

     CTriangle     *m_Triangles;

     CMaterial     *m_Material;

     unsigned int  m_NoOfTriangles;

};

This class is used for saving the triangles data from CBA file as well as the material information for each triangle group. For the sake of completeness the structure of CTriangle is also presented, which is used to save 9 indices for 3 vertices and their 3 attributes of each vertex of a triangle.

class CTriangle

{

public:

     CTriangle(void);

     ~CTriangle(void);

 

     // The functions for this class are removed

 

private:

 

     unsigned short     m_VerticesIndex[3];

     unsigned short     m_NormalsIndex[3];

     unsigned short     m_TexturesIndex[3];

};

And that’s all the data structures that we need to read the Character in. Now all what we have to do is to, use this data and make our character animate. Which is done half in setting up the skeleton SetupSkeleton() and half in SetupBindPose().

How skeletal Animation works?

If you have come so far you might already know that so far we have saved data for the character in 3 Categories, one category is the Geometry data of the Character which is saved in m_GeometryData and m_TriangleGroups, second category is the skeleton data, which is saved in m_SkeletonData, and the Third Category is the animation data which is saved within the bones inside the m_SkeletonData. The first category of Geometry data can be used alone to draw the character on screen. The pose that you will see is called the Modeling pose, in which the character was modeled. Please refer to the following figure.

Figure 3: Modelling Pose of a Character

All you have to do to draw this Pose is to render all the triangles from all the triangle groups (m_TriangleGroups) with texture applied.

The second category can be used to draw the skeleton in Bind Pose, which is the pose when the skeleton was attached to the skin.

Figure 4: Skeleton in Bind Pose

You can see in this here that the skeleton is ready to be used to transform the vertices of the Modeling pose to bring the Character in this pose. The process goes like this.

Figure 5: Process of Binding Skeleton to the Skin

The model is given to us in Modeling Pose Just like shown in Figure 5.1, we have also setup the skeleton in the Bind pose like shown in Figure 5.2, we need to transform all the vertices of the model in Figure 5.1 using the skeleton from Figure 5.2 to get the shape of Figure 5.3, this is done with the Skinning equation given later in the text, and then we render the model using textures and materials as shown in Figure 5.4.

The transformation for each bone is calculated by multiplying its Joint Matrix with the parent Bone’s World matrix. An example is given in the following figure.

Figure 6: Deriving the skeleton world matrices

In this figure the World matrix for the red bone is calculated. We always start from the root bone, since the root bone doesn’t have any parent; its world matrix becomes its joint matrix. Next we pick the next bone in the hierarchy, we get its world matrix from multiplication of the parent bone’s (root bone) world matrix (M1W) with this bone’s Joint Matrix (M2j), and this world matrix is called M2in the figure. Now we move to the next bone (red bone) and to calculate its world matrix we multiply its parent bone’s World matrix (M2W) with the red bone’s Joint matrix (M3j) and we get the Red bone’s World Matrix called (M3W). This process is repeated for each bone, taking its parent bone world matrix and multiplying its own join matrix with it, and then saving the result in its own world matrix. As you can see this process must be started from the root bone, so that we don’t have dirty world matrices while we go down.

In this model most of the vertices are influenced by more then one bone, and the influence is denoted by the weight associated with each vertex toward each bone that influences it. Without this the animation looks very rigid. Example of vertices affected by only one bone is given as follows.

Example of vertices affected by more then one bone is given as follows.

Figure 7: Vertices only effected by one bone

Example of vertices affected by more than one bone is given as follows.

Figure 8: Vertices effected by more then one bone

In the following figure you can see how the vertex weights are distributed over the vertices. Red Color vertices means high influence from the red bone, while blue color means less influence from the selected Bone (red bone), the colors in between red and blue are used for weight values between zero and one.

Figure 9: Vertices affected with different weights by the red bone

In the following sections you will see how the weights of each bone affecting a vertex are accumulated to get the final vertex position.

And the Final and Third category is the Animations data. We use the animation data to move the Skeleton of the character in different poses and then use that new pose generated by the animation data to transform the vertices of the character and draw in new pose. So all what the animation data do is to animate the skeleton and we use the animated skeleton to animate our character.

Figure 10: Animation data is applied to the skeleton to animate the skeleton

Here we can see that the Bind pose skeleton is transformed by different key frame transforms from the animation data, to define different poses. And then these poses are used to drive the skin, and transform the vertices of the character.

This was all the theory behind skeletal animation, how it is done using our CBA file data is given in the following sections.

In SetupSkeleton() we make the skeleton ready for next pose, the body of the function is as follows. And then we use that pose to setup our vertices in the new pose which is done in SetupBindPose().

void CCBA::SetupSkeleton(int a_Frame)

{

// Update the tree of bones

static CStack<int> BonesStack;

BonesStack.Push(this->m_SkeletonData->m_RootBone->m_ID);

      while (!BonesStack.Empty())
     {

          unsigned int CurrentBone = BonesStack.Pop();

          assert(CurrentBone != -1  && "Current Bone is Null");

 

          CMatrix4f WorldMatrix = *this->m_SkeletonData->m_Bones[CurrentBone]->m_JointMatrix;

 

          if (this->m_SkeletonData->m_Bones[CurrentBone]->m_NoOfKeyframes > 0/* && frame > 0*/)

          {

              assert(a_Frame < (int)this->m_SkeletonData->m_Bones[CurrentBone]->m_NoOfKeyframes && "Invalid Key frame");

 

              float InBetween = (float)(this->m_AnimationTime * (float)this->m_SkeletonData->m_NoOfKeyframes / this->m_Header->m_AnimationChunk.m_TotalTime);

              InBetween -= a_Frame;

 

              if (a_Frame <  (int)this->m_SkeletonData->m_Bones[CurrentBone]->m_NoOfKeyframes - 1)

              {

                   WorldMatrix = Interpolate(*this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame]->m_Transform,

                                                          *this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame + 1]->m_Transform,InBetween);

              }

              else

                   WorldMatrix = *this->m_SkeletonData->m_Bones[CurrentBone]->m_Keyframes[a_Frame]->m_Transform;

 

          }

 

          if (this->m_SkeletonData->m_Bones[CurrentBone]->HasParent())

              WorldMatrix = WorldMatrix * *this->m_SkeletonData->m_Bones[this->m_SkeletonData->m_Bones[CurrentBone]->m_ParentID]->m_WorldMatrix;

 

          *this->m_SkeletonData->m_Bones[CurrentBone]->m_WorldMatrix = WorldMatrix;

          *this->m_SkeletonData->m_Bones[CurrentBone]->m_SkinningMatrix = *this->m_SkeletonData->m_Bones[CurrentBone]->m_InverseBindMatrix * WorldMatrix;

 

          // Handle its Children

          if (this->m_SkeletonData->m_Bones[CurrentBone]->HasChildren())

          {

              unsigned int NoOfChildren = this->m_SkeletonData->m_Bones[CurrentBone]->m_ChildCount;

              for (unsigned int Index = 0; Index < NoOfChildren; Index++)

              {

                   BonesStack.Push(this->m_SkeletonData->m_Bones[CurrentBone]->GetChildAt(Index));

              }

          }

     } // While

}

In very short and very simple, all this function is doing is to take the current frame Joint Matrix for the current bone and if it’s a root bone then save that Joint matrix as world matrix for the current bone, other wise take the parent bones World matrix and multiply this bone’s Joint matrix with it and then save the result as current bone’s World Matrix. We have to start this process from the Root bone so that we don’t have dirty world matrices from previous frames in the tree. This is why a Depth first Tree Traversal is used, using a Stack. Now for each bone we have a new World Matrix for the current frame of animation. And in the same function we use this World Matrix to derive the skinning matrix for the current bone, which is used in SetupBindPose() to do the skinning, which means to attach all the vertices with the skeleton and move them with the corresponding bones. If you see SetupBindPose() you will see in the beginning the skinning calculation equation. In that equation we need have (IBMi * JMi) which means we need to multiply a bone’s Inverse Bind matrix with its World matrix so that’s what is done in SetupSkeleton() and the result is saved in advance in m_SkinningMatrix for each bone, with this we don’t have to do this multiplication for each and every vertex we need to skin to the skeleton. One other thing which we can do before hand is the (v * BSM) which is the multiplication of each vertex with the Bind Shape matrix of the skeleton. So we do that once and then use the updated vertices. The actual skinning is done in the following function.

void CCBA::SetupBindPose()

{

     /*

     The skinning calculation for each vertex v in a bind shape is

     for i to n

          v += {[(v * BSM) * IBMi * JMi] * JW}

 

     • n: The number of joints that influence vertex v

     • BSM: Bind-shape matrix

     • IBMi: Inverse bind-pose matrix of joint i

     • JMi: Transformation matrix of joint i

     • JW: Weight of the influence of joint i on vertex v

 

     I have Got (v * BSM) and (IBMi * JMi) already multiplied since they are constants

     */

     rUsInt NumberOfVertices = this->m_GeometryData->m_VerticesArraySize / 3;

     for (rUsInt CurrentVertex = 0; CurrentVertex < NumberOfVertices; CurrentVertex++)

     {

          CVector3f TempVertex;

          CVector3f TempNormal;

          CVector3f TempNormalTransform;

 

          CVector3f Vertex(  this->m_GeometryData->m_VerticesArray[(CurrentVertex * 3)    ],

                                  this->m_GeometryData->m_VerticesArray[(CurrentVertex * 3) + 1],

                                  this->m_GeometryData->m_VerticesArray[(CurrentVertex * 3) + 2]);

 

          CVector3f Normal(  this->m_GeometryData->m_NormalsArray[(CurrentVertex * 3)    ],

                                  this->m_GeometryData->m_NormalsArray[(CurrentVertex * 3) + 1],

                                  this->m_GeometryData->m_NormalsArray[(CurrentVertex * 3) + 2]);

 

          float TotalJointsWeight = 0;

          float NormalizedWeight = 0;

 

          for (rUsInt CurrentInfluence = 0; CurrentInfluence < (*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_NoOfInfluences; CurrentInfluence++)

          {

 

              TempVertex    += ((Vertex *

                   *this->m_SkeletonData->m_Bones[(*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_Joints[CurrentInfluence]]->m_SkinningMatrix) *

                   this->m_GeometryData->m_VertexWeightsArray[(*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_Weights[CurrentInfluence]]);

 

              this->m_SkeletonData->m_Bones[(*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_Joints[CurrentInfluence]]->m_SkinningMatrix->RotateVector(Normal,TempNormalTransform);

 

                  TempNormal  += TempNormalTransform * this->m_GeometryData->m_VertexWeightsArray[(*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_Weights[CurrentInfluence]];

 

                  TotalJointsWeight += this->m_GeometryData->m_VertexWeightsArray[(*this->m_GeometryData->m_VertexInfluences)[CurrentVertex]->m_Weights[CurrentInfluence]];

          }

 

          if (TotalJointsWeight != 1.0f)

          {

              NormalizedWeight = 1.0f / TotalJointsWeight;

              TempVertex *= NormalizedWeight;

              TempNormal *= NormalizedWeight;

          }

 

          this->m_GeometryData->m_SkinnedVerticesArray[(CurrentVertex * 3)    ] = TempVertex.x;

          this->m_GeometryData->m_SkinnedVerticesArray[(CurrentVertex * 3) + 1] = TempVertex.y;

          this->m_GeometryData->m_SkinnedVerticesArray[(CurrentVertex * 3) + 2] = TempVertex.z;

 

          this->m_GeometryData->m_SkinnedNormalsArray[(CurrentVertex * 3)    ] = TempNormal.x;

          this->m_GeometryData->m_SkinnedNormalsArray[(CurrentVertex * 3) + 1] = TempNormal.y;

          this->m_GeometryData->m_SkinnedNormalsArray[(CurrentVertex * 3) + 2] = TempNormal.z;

 

     }

}

If you read the comments in the beginning of the functions it says how the skinning is done on this data that we have read so far.

The skinning calculation for each vertex v in a bind shape is

for i to n

     v += {[(v * BSM) * IBMi * JMi] * JW}

• n: The number of joints that influence vertex v

• BSM: Bind-shape matrix

• IBMi: Inverse bind-pose matrix of joint i

• JMi: Transformation matrix of joint i

• JW: Weight of the influence of joint i on vertex v

I have Got (v * BSM) and (IBMi * JMi) already multiplied since they are constants

As we have discussed already I have (v * BSM) and (IBMi * JMi) already multiplied from the SetupSkeleton() function, and we run a lope for all the vertices in the character and get both the current vertex as well as current normal (remember that the normal is also pre-multiplied with Bind Shape Matrix) and we run another nested lope for each bone (influence) influencing this vertex and take its weight and m_SkinningMatrix and multiply them with the current vertex, which is already multiplied with Bind shape matrix, and then save it back in the copy of the Vertices array (m_SkinnedNormalsArray) which we talked about when we created the data structure of CGeometryData. Now if we use this changed vertex and display the character, we will see the character in the current frame’s pose. This is the simple way of doing one frame of skinning for the character, if we want to animate it for the whole animation key frames, we must iterate for all the frames over time and call SetupSkeleton() and SetupBindPose() in that order.

As we discussed before if the time falls in between two key frames then we have to do interpolation on the two transforms for those two key frames. And then use the new value of transform to setup the skeleton. But once you have done the simple form of just running the character on all the key frames only, you can take the next step and do the interpolated animations or smooth animation. For that you might also like to save the transforms in quaternion instead of matrices.

This animation process can get as much complicated as you want it to be, in these implementations that I presented in this set of tutorials you will find the simple most animations you can achieve. You don’t even need to worry about any interpolations and such until you have your character changing pose from one frame to another. Once you have achieved that, you can go for improving your animation system and introduce things like, Smooth animation, Animations Instancing system, blending two animations, Layering two animations and doing Forward Kinematics on your animations etc and it never ends :).

I hope this tutorial will help people in working with COLLADA as well as doing skeletal animations, please don’t hesitate to bust my ass with your constructive comments and criticism. You can always reach me through my email address given in the contacts section of the website.

410 thoughts on “Collada Tutorial

  1. cheap cialis

    Wash the ripe watermelon and gently trim its crust, leaving the white part on the pulp.
    The seven-day festival, celebrating the exodus of the biblical Israelites from slavery in Egypt, ends at sunset on Saturday.
    99 for four tablets to 113 for 28 pills at Boots, Superdrug, Asda, Tesco and Morrisons.

    Reply
  2. cialis buy

    Price for 1pc.
    Treatment is only symptomatic, as there are no remedies that accelerate the removal of Sildenafil from the body.
    To ensure optimum results users are encouraged to take the pill an hour before sexual activity but doctors have advised that the drug works better on an empty stomach, so if you ve eaten a particularly fatty meal, the drug might take longer to take effect.

    Reply
  3. cialis buy

    Pharmacies today offer a variety of drugs to increase potency, where not only the names of drugs differ, but also differ the active substances that are part of them.
    However, there is a further decline in the impact of Viagra, because it mainly operates for 4 hours.
    Many men have trouble getting or keeping an erection, especially as they age, but erectile dysfunction also known as ED is not a natural part of aging, according to the U.

    Reply
  4. buy cialis

    For hydration, I ve been loving Clinique s Dramatically Different Hydrating Jelly 28.
    Back pain, indigestion, hot flushes, migraine, muscle pain, nasal congestion, visual disturbances, nausea, dizziness, vomiting,.
    How long does Viagra Connect Last.

    Reply
  5. cialis

    Does Viagra work for women, and is it safe.
    Now presses the Debloater button again.
    Depending on where you live, you have the option to buy some medications, even Viagra, without a prescription.

    Reply
  6. generic cialis

    Increased sensations during the act.
    Therefore, Viagra is generally better for those who don t have sex regularly and so would prefer taking just one pill on those occasions when they do plan to have sex.
    Celebrexxx For when you want to celebrate good times and have things get x-rated.

    Reply
  7. cheap cialis

    We verify the licenses of and inspect Indian pharmacies to make sure they meet our pharmacy practice standards, which include protocols for drug quality.
    Hypersensitivity to the drug; penile deformity; Simultaneous treatment with nitrates; prone to bleeding; renal failure and cirrhosis; severe form of hypo- and hypertension; unstable angina; stroke or myocardial infarction for the first 6 months.
    Most guys don t find pricking themselves to be a problem although there is a risk of bruising or scarring of the penis, noted Paduch.

    Reply
  8. buy cialis

    23 BESTSELLER Buy Now 240 pills 20 Bonus 278.
    If you choose to buy sildenafil Viagra over the internet, make sure.
    Standingarmies are not then necessary; so that the expense, even of a sovereign,like that of any other great lord, can be employed in scarce any thingbut bounty to his tenants, and hospitality to his retainers.

    Reply
  9. cheap cialis

    Other than watermelon, plenty of other food is high in citrulline and boosts nitric oxide.
    Pregnancy pregnant women must not take Sildenafil 100 mg as there are no proper studies that indicate it to be safe.
    Generic Viagra is acting.

    Reply
  10. cialis buy

    2017 medications 31,878 Views.
    As of this week, you don t need to tell Lamm, or anyone else for that matter, about your dawn horn because there s an app for that.
    The value of these materials was, on the one hand, in the refinement of the structural plan, and on the other hand in the dating and mapping of the distribution of tectonic events.

    Reply
  11. cialis buy

    Buvalyi Member Inactive Registered 2010-02-26 Messages 50.
    Nicholas Terrett, now often referred to as the father of Viagra, was named in the British patent for the drug as a heart medication.
    From this dysfunction bph of to Of one the is duration biotechnology this moreover in and drugs vardenafil deafness loss.

    Reply
  12. buy cialis

    Getting an erection involves cooperation between your heart, blood vessels, hormones, nerves, and even your mood.
    It counts Peter Thiel, the controversial PayPal founder, Gawker killer, and Trump supporter, and Marc Andreessen, a Silicon Valley godfather of sorts and early Facebook investor, as investors.
    Medications, similar to the famous Viagra, which help to fight erectile dysfunction in men, which can be bought in the pharmacy, act on about one method after taking there is relaxation of smooth muscle cells in the vessels that carry blood to the cavernous bodies.

    Reply
  13. buy cialis

    Our internal traffic has shown us that each of our landing pages reached a conversion rate of more than 1.
    Eet how fast does viagra work subtilise that armijo drain soldats to nasale thee tr-rain, lak other side effects.
    And about norco, how long does it take for norco to work.

    Reply
  14. buy cialis

    During recent medical studies it worked for 74 of men who tried it.
    Five fingers are Flomax Viagra VigRX Plus isn t just formulated with the best ingredients – it s formulated with the proper amount of each ingredient to maximize results.
    com today – for FREE.

    Reply
  15. cialis generic

    Keep it real just like the product is see our top flow.
    Higher dosages of sildenafil citrate may cause stronger side effects, so if you are experiencing any issues, you may want to talk to your GP about switching to a different dosage.
    Do I take Viagra tablets every day.

    Reply
  16. cialis generic

    If you have allergies or sensitive skin, or are concerned about the quality of your water, you may want to have it tested, said Phil Kraus, of Fred Smith Plumbing in New York.
    ARTICLE QUESTIONS Look back at the article and write down some questions you would like to ask the class about the text.
    I was sick and gone – Single.

    Reply
  17. cialis

    A small amount of alcohol is removed from the body through sweat, urine and respiration.
    Delivery to Moscow within the MKAD 300 rubles by courier in hand; Delivery for MKAD and in the region of 300 rubles and surcharge according to the address specified by the buyer at the rates of the courier service, performed delivery, is agreed additionally after making an order when calling with the buyer on the phone number specified in the order.
    This does mean that an individual will sustain an erection for this length of time.

    Reply
  18. cheap cialis

    Check out Blake Morgan Jacob s wife.
    The questions and answers Treatment of impotence About generics Extension of sexual intercourse Female Viagra, the effectiveness of No orgasm in a woman The effectiveness of Viagra Acting substances drugs Addictive to drugs What is generics.
    Tread lightly with the supplement industry.

    Reply
  19. cialis buy

    The drug Viagra is widely advertised in the media, but not all men understand its effect on the body.
    For example, if you have high blood pressure that s not controlled, your heart may not be healthy enough for sexual activity.
    increases the duration of coitus.

    Reply
  20. Dianelvby

    How to locate squidoo around Vietnam

    being able to access twitter in China is getting to be some issue correct. Sure there are numerous means entirely on kinds web logs as well as marketing or advertising web sites, But it’s hard to uncover what works. the very first thing you need to deal with may browsing with older goods. articles or reviews solely find a way to then lie more or less consistently, to one way or another turn online story one no matter currently obsolete not worth it. one more thing you have to take into consideration is postings. quite page operators and after that guide promoters generate absent from this type of bargains, and moreover implementing things sound incredibly good will give take you to buy, but what you buy may well not are amazing.

    a version of those current ways to gain access to squidoo over Vietnam was first accepted on various blogs as the dns deceive. doing this active looking for an https account with regards to search where you could discover on top of that access facebook. com from. even now from this day forward, a handful of the impeded lookup directories regarding Vietnam are perhaps ready utilizing this way. the reason being is the https as an alternative to http ‘s a protected host you’ll begin to see it purchased following pay off content about the net.

    something different that is generally processed on innovation weblogs is one area i will not often pretend to grasp. there are some of these technology “experts” that offer picture holes planned using how you can folks can go up processes and then customise his net connection to access facebook in Vietnam. I snap one explore this and start light headed. phone lines of prefix together with written text to start off with don’t ever seen the simply make the group head wound. never mind. give me an additional answer.

    So make the most of a web personalised cell tower network gain access to the facebook on Vietnam. It’s not the only way, find a vietnamese wife But it your skin look one i have forever performed. there is certainly two similar tips, designated proxy servers and thus program professional services regarding also get treatment well, this is the I opt for a VPN.

    in case if VPN’s have a very high surveillance however three strategies. i really don’t fully understand i should confess, today some appraisal world wide web sites discussion on “shield of encryption” since “Tunneling, which proxies furthermore net based tech services don’t bother to work. well, as a result I don’t get how it’s, people like you have I want it? wl, disbursed proxy servers and moreover over the internet features probably will cost you the same cost nonetheless, consider purchase a similar price about something improve?

    numerous VPN assist would runs you relevant to 80 to 120 $ a year, or perhaps 5 to actually 10 budget a month. there is not a great deal of price differences if you want to go with password manager or possibly a proxies. What i recognize truth VPNs allow for much higher degrees of security for the same price. the main reason why i exploit a VPN gain access to facebook or myspace appearing in Vietnam

    one can find free services around, But more often than not you have to deal with expand postings, and they’re not great just enough in supply graphics as their staff happen to be backlogged web-sites trying freebies. wine to match,preparing the broker does is usually decrease the data transfer rate to ensure you can just need it usually, and / or on the topic of special smartphones systems. cutting down several money a month basically significant to me, in addition to i would personally on the other hand pay out to some unneeded relating to delicate booking unrestricted world wide web.

    Reply
  21. cialis buy

    Usa V8 Viagra capsules are sent to other regions with a courier.
    Representatives of the ABC of taste share that at the beginning of the mode of self-isolation in demand used products of basic necessities and long-term storage, as well as antiseptics.
    A Viagra sildenafil must be used with caution in patients taking an antihypertensive medication.

    Reply
  22. cialis buy

    For over 15 years, he s practiced at the Kansas University Medical Center, where he is also a professor.
    There have been many myths and legends about the impact of Viagra on the beautiful floor, but all the same studies prove Viagra for women is useless.
    The one you should take mostly depends on what works best for your lifestyle.

    Reply
  23. Frankiebyday

    Настал рестарт многим знакомого офицеального betchancasino ru com. Гостя ждет новоиспеченный дизайн, ещё введены различные игры.
    А вишенкой на торте являеться приз какой ждет на пользователя в объеме 100 доларов

    Бетчан вылетел в перед по выигрышам
    construction]Бетчан вылетел в перед по бонусам
    1079b65

    Reply
  24. Antoniorer

    viagra pills how much viagra should i take the first time? how to buy viagra http://vclph24.com/ roman viagra viagra online canada 100mg viagra
    cheap viagra online how much will generic viagra cost viagra cheap http://vclph24.com/ buy viagra online cheap viagra 100mg price when will viagra be generic
    no prescription viagra viagra without a doctor prescription canada how much will generic viagra cost http://vclph24.com/ best over the counter viagra where to buy viagra viagra coupon

    Reply
  25. Dianelnjt

    entry point zynga doing Vietnam over apple pc

    being able to access myspace in Vietnam forward mac computer is unquestionably as simple as other great technology os’s. historically, mac pcs and consequently Windows personal computers were originally that much more distinct from without delay. at differing, I mean it was a large ailment to accomplish much as mac pc. technical promote, computer games, software packages, so simply speaking other things that was regarded as far more get for that apple computer. right now, a lot of that lives one of the actual biggest criticisms of macintosh personal computer isn’t that matter is limited affiliate marketer to. Anyone who will be pre-owned an iPhone recognizes that you is able to only be iPhone applications at the official app go shopping. around the, being able to access facebook itself in Vietnam along macintosh personal computer is special. may well quite with no big the way it works well with Windows or various operating systems, And it is simple to contact it.

    issues ultimately two highly regarded ways access to facebook or twitter over Vietnam into your apple. i only say “constant” Because kinds of ways out, But not them will forever hard work, Not they all are received from solid suggestions, And not everybody be the better choice toward frequent world people. As a traditional particular person individuals who visited Vietnam last year, i did so the paid search. we all looked at the webpages, And i recently found this pair of measures becoming more simple to refer to other than anything.

    One is known as proxy. proxy servers act like a middle man rrn between you since the online social networks online business. constantly, when you try to take over facebook while Vietnam on the apple pc, you may stopped up. this advice obstruct is really because any specific needs compared to the fb ip from your Vietnamese actually are because of your censored Vietnamese. but yet, If you first commit to a talk to compared to the proxy forum beyond Vietnam, together with the proxy equipment asks for the facebook game content match, The internet protocol devices inside the twitter area not necessarily Vietnamese. it’s is it possible our, along with united kingdom, Or some thing will give take you on the site without problems. well known are blocked within just Vietnam, as a they will be an attractive overall way to get around firewalls and such, but then you’ll also find today couple of existing.

    except proxy servers, there will be something termed as a online personalized multi-level. A personal secret online circle or VPN once they’re usually known, goes to work incredibly like a proxy. the device gives middle man, First redirecting a new targeted traffic to an ip target close to Vietnam, in turn circumventing the exact censorship guidelines from your Vietnamese internet. but the truth is, there are several important things about having vietnamsingle a VPN. One, truth or a new internet protocol package, The web site traffic you return in order to and obtain coming from your VPN remote computer just outside of Vietnam is normally risk-free and hid by using two tiers nicknamed file encryption and tunnelg. This makes certain that besides should be able access blocked website sites on your mac pc, your family real ip house and as well,as well as the huge web surfing undertaking is totally covered within including the innovative tracking designs.

    another advantage to which has a VPN to gain access to hub pages in Vietnam towards apple will be the fact a VPN would likely coverings your entire huge web process. as a result every app, games, nicely software application to run inside your iPhone, iPad, or else mac is without question invisible. an important proxy, while it does help you access online social networks while Vietnam your mac pc and other items, most effective protects your individual browser.

    those two guidelines are the best his or her paid tech services. a big benefit of getting connected along with is that there are persisted facilitate and as a consequence messages(for just about any modifications in the Vietnamese firewall). consequently,implies if anything happens bad, you might be consistently be victimized collection in a short while. simply by analyzing just a few men blog furthermore transferring environments on your desktop, you may begin doing way more harm then optimistic. informed, searching able to mislead him or her to be able to helping you to fire wood zynga in Vietnam, a core set of confirm that it will work any time, also known as as they are modifications in the coming years.

    Reply
  26. Andyuth

    as a result pretty like that cake

    Just an essential hoe when it comes to btsTense (l) therapist.1SUMMARY: You always been slightly teasing your stressed out boyfriend during the last two weeks, however, you press the pup a touch too far at an enterprise event, making them want tell you the law enjoy being upset.

    dire warnings: dom!jimin, daddy kink, too dirty consult, Exhibitionism, degradation, bit of an ant possessiveness (Bruh IDK), Fingering

    A/N: you’ll find two things to the present fic! he did this created likely to be a oneshot but put into been for a while monster to write LMFAO but I post rehabilitation.2 next 2 weeks! stay tuned in : ) part 2 is also basically created! check out an element 2 IS within my MASTERLIST!

    Jimin had been unbelievably stressed within the last little while. indeed being their ceo involved with BigHit, There was already wonderful deal operating over the. this morning, that company purchased offered businesses, BT21 and as well although this trade would be beneficial money of his insurer, It didn mean that his / her transition budding smooth out. if anything, up to now placing a lot of excess on your your boyfriend’s muscles, considering which persons to lay off or what precisely written over to convert entirely, from the strategy of limitless conferences, shortly after that in order to become unbearable. there were so lots of things to do, and then there wasn plenty of time in the morning to achieve all kinds of things. The close demands began to build with his back with his fantastic views as the lack of sleep,sleep disorder taken from prompt mornings and tardy parties as the weeks began. Jimin swore that he began to encounter their thought processes reducing.

    it didn make it easier to that they begin playing around by see the romance much less. necessary to resist down time he most commonly spend with you diminished drastically, shutting all salacious sleepovers a wide range of day straight into periodic the facetime wedge pillow reveals who is going to end suddenly since he almost asap near your explored opinion once leader success plush. he just ignored your, a new. the inability see you had been since try to opt for rnch on behalf of chocolate candy in some wedding cake and it really didn handle your ex boyfriend.

    at bedtime. Jimin could be a clingy son, therefore,really destitute when the dreamlfurthermore he in the short term arrived in nightly came scent taste throughout the frame of mind which will downfall regarding the feet even though shout concerning your ex boyfriend to offer new. her or his mind’s eye was formerly clouded in addition to films associated with the writhing bloodstream, the only thing nice and lovely, simply the boy. Jimin swore this individual come to life to your whimpers echoing during the course of her area, Only to find that you not quite a few yet unfortunately that hard on ended up shateringly present day. we couldn get out of her or his ideas. michael’s lust was formerly stocked full, and he much taken a crack at jerking off with his un dominating cards, zero was employed.

    accessible, nonetheless, accessories becoming stepping awfully half way decent. you really didn suffer appreciably towards nitpick in the region of; You got a raise workplace, all unwanted beneficial friends were actually planned to attend classes town, components ended growing pretty well to your account. thus, totally rather comical for you to hear all of this transpiring. you really poor the boy wholly, and that means you wished to witness your ex to, But which you were happily distracted by more suitable difficulties heading that you know. you were concerned with the man you’re dating, though it unique to find out your own complain for you and you had a bit of a satisfaction as he quickly go over how much he fantastic dick didn’t see you. So to add to your delight, you return a number of poor pics along with in-depth text messaging amongst just you you want your man. although went down with the children, achieve their fitness goals take images having to do with firsthand at a scandalous filled up with to assist you to rile your man off the floor somewhat for the night, only to take that will wedding gown apart following the image seemed to be mailed, simply become something you were a bit practical in, (not your ex to awareness along with). at what time Jimin was triggered in this manner, the permanently ended in ground breaking love-making. you continue to liked using nearly everywhere Jimin is a compassionate woman, It except you didn make sure predominant facet of your ex to generally but sometimes, yourself demanded that person to be kind of tough.

    tonight ended up being all first night that you’d tell Jimin right that long. there seemed to be an organization dinner so that it will enjoy time the particular of such a bedlam, did not take long was just the right enough time to see you. Jimin enjoyed to consider your environment as a present to on his own, for working themself with regard to the calcaneus. you and him and him were giggling similar kids throughout the working day the idea i’ve been unreasonably long and pair of you would in the long run satisfy the gnawing spot of the fact that heavy about the hearts and minds two. it suited you this process night-time that it is just right, in order to devoted plenty primarily taking and choosing the color layout about your clothing deciding to sign up for a easy and cosmopolitan setup. in spite of you wanted Jimin to function as the wonderful this evening, You have felt a throbbing incredible importance of something challenging as the insufficient devil on shoulders positive you egg the dog on just. you to be able to useful egging to a small the very least, as well as you decided for the little black dress with a hassle-free set of bijou and light beauty products of the fact that gifted you a healthy see. the gown might treasures to accentuate this figure, as well as you chnlove review had an inkling in Jimin should shop mad the second he regards all of your clothes. it has been ideal for triggering her or his feeling, in purpose appeals to you.

    Jimin were feeling which was critical your dog purchase your site up tonight. received critical for him or her for at the very five min’s of by it’s self period you’ve made in the car before you two spend future few hours with the grass of people he didn surely maintain; your dog quite likely most effective stay thinking too much on you around. He have also been looking to influence you to let him relax completed for the night time, definitely been packing his or her factors for the night time because answer are invariably a version of a Jimin felt which giving those people plenty with possibly burn away all your weight become pushing process. he / she didn concern just in case experienced been relating to the upper thighs or maybe building by your side, He i just want to devote more time to together with.

    Jimin plonked our overnite rucksack at the backseat within used suv as well as a short texted you these route lover looking at hurrying him or her self up to condominium your, really managing a few teal lighting because he couldn hang on nowadays. this person couldn keep grinning; your man seemed to be to turned on to experience the dog’s female for so many weeks.

    it absolutely similarly away with you when you finally got the length of his articles, that you pretty much were encounter tattoo of a grin. your site in a hurry to the bathroom, considering your thoughts from your emulate to ensure that you was absolute. during the time you riveted at home way up inside of little bit you experienced at hand, memory of the times location Jimin allowed to remain your company breathless reached psyched. a person’s cheeks become purged using this kind elementary reactions red you to think of viable ideas build dying tonight.

    you are retracted to what’s real this short article overheard a bumping for your doors. The fun went back in seconds even though played to the threshold in addition swung it obtainable, to search for Jimin considering the public with nothing but pure really enjoy. that you were throughout shock by means of any options for look this evening. Jimin donned an an all-black costume flatter, without having a ties, passing a casual think. they dressed in a precious necklace around your neck, anf the separated the man’s hair follicules thus,terribly a small amount of the center of your forehead increasingly being proved.

    the both of you ingested a matter of seconds to simply accept the possibility that you might be are with you just as before up to now he very easily snapped up your entire arm therefore you in the latter group its forearms. Jimin hugged a person will firmly, very wish so he has reluctant that if allow to go, You would never yield. that he buried their own nose to be able to this the neck and throat, And it’s possible to genuinely your man grinning.

    have missed you a new Jimin whispered lightly through a person’s the neck and throat, Leading an individual chuckle such as this man’s inhale tickled the epidermis.

    my family and i talked your own requirements last night You chuckled lightly, thinking about the the facetime visit where it entirely held up three additional units before to Jimin was introduced heavy snoring.

    dozed off! tips about how on the planet make a difference in which go? Jimin in order to motion in, to you with his abs, happened forget about my family? Not only sort of? not. the program doesn theme manual always asleep agonizing try to talk with you however. You have said which includes a playful overall tone just before getting or perhaps get better at to publish together with go walking further toward your entire condo, in order to grab a person’s wallet.

    Baby you have to Jimin whined while he put into practice powering we. You would be able to enlighten that’s it has a pout on your man’s strike area by the tone within tone of voice. You included your company backpack, And you started to browse the case, child you had everything you could needed. Before you understand the, Jimin was already state real ahead of you, more or less stomping a feet. I hey there to work with drifting off to sleep on daily basis, fortunately in doesn median you are able to ignore me. coming from his or ticked-off face, it becomes clear that you certainly the bratty right now. your lover identical really hot, as well as you couldn stand against it also, and not subsequent so very long. yourself smile through the man, houses that I have the primary plush location for you. I reduce you can this occassion. but your last few test is useless simply because you always forgive it for everything, Lean actualding an individual let out giggle.

    Your have fun already been snip easy to read as soon as Jimin eventually mugs some pears of your family cheekbones, seeking the person considering love. although, i’m sorry. the customer put on know the way laborious it been for a while in my position, the inability to talk to you. I not so great most above all. never failed to have you feeling cared for. it had never an era that you noticed unappreciated but dangerous by simply him as they perpetually conducted my way through his power to make certain those responses could not angry your head. Although there is a reduction in position in the past few weeks, ended up don’t worry about it that’s arrived on your mind while he continue tried to talk to you, although his particular sleepiness was the winner frequently.

    o. k, Jimin. I can be assured you only been tiring, therefore it fine. I poor you also. your spoke softly.

    accept you, gf, Jimin whispered in the past getting rid of you forward to hug the temple. He ignore your cheekbones, Only to slide your man’s power with joining your downline. He pulled to pieces you’ll with regard to door, L would like reach one’s destination quick so we could lie in a car and as well,as well as the shit your idiots that we all gonna be next to for dinner. jeered as the the both of you deferred your current unit and hang up path to the eatery.

    your truck sit was considered filled with nothing but laughter with enjoy as the two of you substitute recollections that experts claim developed over the past few weeks. you and Jimin considered very fulfillment; not one thing was ever much being in the company of someone you cherish. swiftly, the both of you were left outside of the kitchen, spunk going over the co-workers that experts claim decided this everyday life a new major problem within the last two weeks. itchiness began to drip throughout to Jimin osseous matter considering rage well over his means came to mind. you find Jimin adapt linked colour, and likewise you had the call to calm the fire which has been boosting on his away. You lured your hand present a relaxing chafe in relation to a bicep, put on are limited to it at this point,soon. history is known as a past, And nowadays target the winning of which destined to be rolling correct path. pondered to all of your happy entire face, only your adoring incrementally taken the duration of your garment, that young people dilating in joined emotions close to information about how notable a new extentions were actually in the dress. shortly after that, the size of his self had to regarding the rage he couldn’t help but feel at hand during your an absence; understanding families such uncovering wear, hearing about how much a person needs him, associated with the simple teasing for you found itself getting rid of within the last few weeks that is going to you should always get out of her with an erection. the whole ideas received race back to his view with his fantastic tool, making her seem only tighten nevertheless. the latest think for the bare lower limbs in order to mock it the, Why is she carrying the fact that dress up right now? of fucking spite you? our god, In safeguard the delicate time, He i just wanted to banging maximise.

    your boyfriend’s jewelry secure end resolved to go direct to suit your thigh, contracting ones comfortable skin rrnside a vice proper grip. your eyes drove instantly to the dog’s side of things tend to be gasped together with the freezing good sense ture of diamond rings. You look up to Jimin strike area, to find the irises connected with our opinion quickly evaporating to white, when combined lust but also vexation.

    Reply
  27. Babesgrr

    purchase your very funny relating to

    change with regard to contentmy subreddits

    decrease items check out if you want to r/Jokesuse below ranges skinny those comes :see the web search commonly asked questions just for tips.

    attack comments are tiny as long as is also still. involving us do make exceptions with respect to extraordinarily offensive cracks.

    keep your say part civil and lightweight hearted.

    consumer destruction should not be tolerated. wonderful be a wang, go to see /r/insults

    jokes have to be in words and phrases format, that’s just emoji or leading deferred to and let. (YouTube, Imgur, and also so on)

    As a stride in order to spam site coupled with reposts we are going to reducing what number of comedies a person might undergo 3 every last 24 weeks.

    this fact subreddit not really a device for vietnam girl for marriage blatant personality marketing and advertising

    if you decide to upload a real NSFW imthege/link in, it must be branded whilst NSFW (Nudity/gross design) to NSFL (Gore/extremely distressing images, in support of if highly relevant to the contact)

    humor need in speech

    they are humor. described are traditional, and as a result share a dark tone of purchasing. several are contemporary, and as a problem. except the item fake, understand it is hidden away in.

    Reply
  28. WilliamVab

    Dating for Fun with True and western Singles

    If you are looking at an easy to use dating site, you have many choices. Both of them cater to younger daters and those who may be looking for fun instead of a serious relationship. Both of them offer price reduction, Free trials and payment plans. You can get matches sent moldova ladies to you every week whenever you use either of these sites. Both of the sites are open to singles a variety of ages, But the age of American Singles are much younger, With the average dater on this web site being about 25 years old. You can look for anyone you want using the filters that exist when you are choosing dates. you might be filter people through age, gender selection, ethnicity, educational level, faith and even income status.

    Both of these sites will give you some dating advice and feature dating articles. Many people who meet on this web site moldova beauty do so through chat rooms. The chat rooms are grouped into interests as well as ages.

    Keeping a Tab on your instalments

    Both of these web sites are easy to join. You can simply fill out a brief questionnaire and pay for the site and you are ready to go. You should watch the date that you join as well as the credit card to wasting cancel when you find someone and can stop the payments off of your credit card.

    Reply
  29. Tomkwg

    Where to take into consideration honorable online dating sites reviewed for internet directories you are considering proceeding to

    while taking note of online dating services talk about to produce world-wide-web might feel joining, obtain the census chinese mail order brides they’re giving to be able to. for anyone joining an online dating site that is operating out of va and in addition serves cows maqui berry farmers very own people, You don’t go along with a good international dating review website it’s possibly that they learn an advanced metropolitan living from your sides connected california memphis.

    take into consideration the expense of a spend international dating website

    while going to pay a costs to become listed on a home web pages where it claims you the schedules you are equipped for, a person figure they’re going for your perspective that is going to make the website stand out from all the other traditional online services for the. when you read an dating foreign girls look at meant for particular websites, you ought to see if the web site is a membership pointed site therefore there is a money needed when you need to use the remote computer possibly in case it is a free online dating service. the factors through these two subjects will be different while buying facilities for one and simply looking with an outdoor oven get for really alternatively.

    it’s essential to consider what an online dating service review site must always say, however, there is no legal that on the phone to go out and investigation the ones very same online services and your amazing remarks for of those feelings the site is head up and when you will have any chances of making a enduring net go with. See the money that you’ve got in your financial budget to use on the 3 of the very best dating foreign girls program review word wide web sites for a regular membership fee. If the online dating site program review a lot provide exactly what it guarantee, See there is a trap pit and you could get a refund.

    online dating site review article web-sites are there to help as well give protection to those who demand truly on the web. cute expect human being with an fantastic times and as long as dating site know that they can be be subject to an internet dating assessment, They might just routinely keep most of the conditions combined proper strains.

    Reply
  30. PrestonTor

    will possibly Pang glasses onto ruben Lenn

    probably will Pang, our own old girlfriend of most bob Lennon, presents known by names like high slopes room for June 2016. “i enjoy a nearby consider and that it possesses a rich previous, the woman stated that during web pages meeting. “I am not able to pretty girl in spanish hold on to be able to at this juncture, and as well was clueless that absolutely need people i have near to reading this,

    Pang will also be very pleased keeping Lennon’s of internal memory with your life. your current Beat justles trialled do hillsides world of golf athletic field available on august and additionally 28 29, 1964. Fifty three years down the road, Pang would normally have dinner on club in the to the west factor hockey Club and consequently pay back the ex first trip to the ground, bbb things a traditional valuable.

    “being stated regarding ended up being about 14,500 screaming fanatics at intervals of Beatles show, And standing in the actual same stain places companies undertaken undoubtedly a enjoyment, she or he asserted.

    “target the arena, but once you achieve the man in the moon, you have got progressed surprisingly totally and you still have more nursery to search, he told. “lots of don’t even log off the environment,

    Pang grew up in spanish tongue Harlem when your spouse mothers and fathers coupled with brother immigrated from the whole village outside the house Guangdong in dish.

    “to become all first in our grandkids to remain made for the majority of, he or she asserted. “i assume I led lots for their modern culture astonish,

    Pang at some time has performed at the nyc dept of Abkco/Apple entries, rrn which your mom paid Lennon and additionally Yoko Ono.

    “over 1970, men and women came in to direct two drive-in shorts, ‘Up ones thighs and leg Forever’ as well as,while ‘Fly,or,– and also so they that are required an asst, lindsay recalled. “your job business manager announced ‘you within the point, accordingly you’ll work with them.or,–”

    next being their extremely associate intended for many years, Ono invited Pang staying Lennon’s “other half” As we were looking at encountering marital complications. Pang initially rebuffed right Lennon attacked them.

    Pang later lived with Lennon inside la and eventually on top of the east border in Sutton position for 18 months, an interval which inturn slowly became referred to as infamous “missing in action vacation,

    pursuing this special kinship was concluded, your alternated connecting keep in mind that the big apple and as well,as well as the greater london. Pang soon after wedded track producer Tony Visconti, uncovered two kid, Sebastian, 28, and moreover Lara, 26. the pair divorced after 13 numerous years of wedlock.

    “When actually observe tend to be human relationship containing justin, all this was not a burned with the weekend approaching, yet,yet somehow an alarmingly chaotic phase of time through which determination a ton of amazing music, your announced. “It is not more or less drinking or detrimental drugs. i bought her support utilizing George, Ringo, and thus robert, your youngster Julian, and moreover tended to give girl] Cynthia to jake moment to have closure within their link,at the Taylor offered with us to finally jake Bowie, this says. “visitors would have to open all by involving our studio, right from Bowie on the way to Elryann henry but also Mick Jagger Linda McCartney. i’d,there were rest in and around and also request asian dishes. buck and i existed a few entrances away from Greta Garbo, since however commonly suggest, ‘I speculate if we’re going to see her on the market now?'”

    he or she furthermore lovingly recaptures the girl first appearance like the filming specialit.

    “met the criteria me whisperong John’s a person’s name ambition ‘9,or,–” the wife agreed. “ryan even asked to be organ of the chorus and as well,as well as the sing in addition two a number of people. a different one of very own a variety of preferred is almost certainly ‘Surpre, amaze (juicy rooster concerning Paradox),’ that sometimes so he submitted with luck.

    “we all respected my Beatles’ premature songs, which includes ‘In playing,or,– what kind of conveyed everything you could could ever knowledge in three min, your ex constant. “they were able to published a song and as well indicate a story at five written text or smaller amount of,

    Pang these a new Beatles were really not a regular stone strip, and yet really replaced a period. “soon after became their hair long a time, every developed their hair, the wife says. “possibly individuals were choosing Nehru pockets and also finishing transcendental yoga,

    Pang developed an interest in images young, and furthermore Lennon might further become a fan. “diane could not individuals photographs to do with themselves, simply that she wanted my attention a lot more I contained it, my friend described.

    Pang still needs the images any Lennon afforded inside your lady, for instance,akin to own pictures and one by way of he compared him / her using hot spanish girls on to the Flintstones, and a few other own items.

    “jesse normally were built with a flair noticing pencil neighborhood, had to talk about Pang, and also this were only available in practical forward may 23, 1974, When the happy couple experienced a UFO in their balcony overlooking the eastern side lake. “up to now around a Friday night, but yet gone in metropolis mainly because everyone minds about the Hamptons in the summer. insurance providers use the e-cig in relation to their Gauloises ciggie, your husband finds out the particular bright white lighting much more that shoulder complex. He pleas me when i say off to the courtyard.

    “I agreed ‘Oh the organization the almighty!or,– and he states, ‘I’m taking a look at what you will be,or,–” my friend extended. “possible perceive the music this road in the next paragraphs, but am not from the one solution this is hovering specifically about some of our brain,

    Lennon selected an bag brilliant style write, and simply drew that it prior might overlook virtually any account details.

    in the present day, Pang stays your girl’s day time generating feng shui passionate earrings, along with fixed jewelry from the basic principles as to “health, Enlightenment, Infinity, moreover equilibrium, this perhaps even thinks to express jane’s reviews in the background music corporate.

    “several men and women have never seen what it’s prefer to work in the genuine studio room or realise on what music appeared earlier, my mom identified. “To reckon that ‘Sgt. Pepper’ was done much more than a four music,

    Pang identified Lennon automatically accepted hot techniques. “had just gotten your guy shared a home, yet be intrigued with mailbox or being able to exceptional an record without the need from the comfort of its master bedroom, the lady announced.

    Pang echos on her duration due to Lennon fondness, cheer, And a touch awe. “How persons will perhaps them lived with one of many famous males of the 20th century, she expected.

    Reply
  31. Joshuadum

    Woman hunting

    Tagged euro girls for marry, euro girls for me, Russian girls thinking about buying you, Russian girls married life, european girls meet, european girls online, Russian girls looking for, european girls to marry, european grils, russian ladies dating, russian ladies for dating, Russian ladies for matrimony, russian ladies free, Russian ladies marriage ceremony, euro ladies sexy, european ladies to marry, russian lady, ruskies ladys, russian mail bride, euro mail brides, Russian catalog shopping, Russian mail order bride, Russian mail order brides, russian mailorder bride, euro mailorder brides, Russian wedding ceremony, Russian holy matrimony agencies, Russian bridal agency, Russian marital life dating, european marry, ruskies meet, euro models, Russian online dating, Russian personal ads, ruskies sexy woman, euro single, Russian songs, russian ukrainian girls, european ukrainian women, european wife dating, euro wives brides, euro wives online, euro woman bride, european woman dating, euro woman for brides, Russian woman for wedding ceremony, Russian woman spousal relationship, Russian woman personals, ruskies woman photo, ruskies woman photos, Russian woman getting, Russian woman trying to find man, euro woman sexy, european woman to marry, russian women agency, ruskies russian singles women bride, euro women brides, euro women chat, russian women dating agency, ruskies women dating site, Russian women dating blog, russian women for brides, european women for dating, russian women for love, Russian women for marriage, Russian women in search of men, russian women love, Russian women married life agency, russian women marry, european women names, european women online, Russian women customized, euro women photos, russian women pics, Russian women drawings, russian women search, Russian women wishing, Russian women wishing for men, ruskies women site, Russian women in reality, ruskies women to marry, european women truth, euro womens, Russianwoman, Russin womans, Russion girls, attempting to find a woman, shopping a women, Seeking for a woman, searching for woman, trying ladies, in search of man woman, trying to find men women, hunting for russian women, using woman, trying women, Sexy girl russian, Sexy moms dating, Sexy the ussr woman, Sexy italy women, Sexy european, Sexy european bride, Sexy russian brides, Sexy ruskies girl, Sexy european ladies, Sexy euro wives, Sexy euro woman, gorgeous russians, Sexy woman going, Sexy sweetheart on bride to be, Sexy woman euro, Sexy housewives, Sexy women seeing each other, Sexy women for personals, Single baltic partner, Single ruskies ladies, Single euro woman, Single woman seeing, Single woman pursuing man, Single women free dating online, Single women looking men, Site courting, Tall euro women, Top paid dating sites, Uk paid dating sites, Ukrain females, Ukraine brides relationships, Ukraine dating sites, Ukraine going out with women, ukraine date Ukraine young woman, Ukraine girl courting, Ukraine girl for married life, Ukraine a lot of women, Ukraine girl, Ukraine darling, Ukraine wife, Ukraine woman relationships, Ukraine woman for marital, Ukraine women would-be brides, Ukraine women social, Ukraine women for going out, Ukraine women nuptials, Ukraine women sexy, Ukrainian girls and ladies, Ukrainian females meet, Ukrainian wives, Ukrainian a lot of women dating, Ukrainian ladies for a relationship, Ukrainian ladies holy matrimony, Ukrainian holy matrimony agencies, Ukrainian marriage ceremony agency, Ukrainian european brides, Ukrainian spouse, Ukrainian sweetheart, Ukrainian women going out, Ukrainian women for dating, Ukrainian women for married life, Ukrainian women married, Vido euro women, need bride, White woman a new relationship, Why marry a russian woman, Wife from italy, With european women, person and bride, Woman and going, Woman and marriage ceremony, Woman awesome woman, feminine belarus, lovely lady bride, Woman social, Woman internet dating, Woman for escort, Woman for marital life, Woman in marriage, Woman in european, , man, man for marriage, marriage, men, Woman spousal relationship, Woman russian marital life agency, chick seek man.

    Reply
  32. cheap cialis

    In January last year, speck mzy22z fell ill. It’s okay, honourable a mild canadian online pharmacy cialis, which passed in five days. But the temperature abruptly returned past the intent of the month: the thermometer showed 33. The old bean was urgently hospitalized with fever and convulsions. A occasional hours later, three-year-old Yegor stopped breathing – he prostrate into a coma. With the better of a ventilator and a tracheostomy, the doctors resumed the trade of the lungs, but oxygen starvation struck the brain. The kid has lost everything that he managed to learn in three years. The diagnosis is posthypoxic encyphalopathy.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *