[PloobsEngine] Tutorial 4 – Lights and Cameras


 

This tutorial will teach you about the PloobsEngine Lights and Camera System. (tutorials series here)

It is very important to say that in this version the Light system is exclusive of the Deferred Rendering technich. We implemented lights for Forward Render also, but it is not included in the PLoobsEngine (performance issues >.<), we plan in the near future to make a tutorial about Phong Shading using that code as example.

Camera System

The PloobsEngine camera system is quite simple and intuitive. In few words: we have an interface called ICamera where all cameras extends. The engine provides some build in implementation for convenience but everyone can make yours as needed. All IScenes must have at least one camera active. You add, remove, interpolate, change …  cameras using the IWorld property called CameraManger.

Avaliable build-in Cameras:

  • CameraFirstPerson (classic FPS camera without restriction, use mouse and keyboard WASD QZ to controls it)
  • CameraFollowObject (camera that follows a IObject)
  • CameraFollowPath (Camera that follows a previous recorded path)
  • CameraStatic (Camera that does not change its location, normally used as base camera when building others (instead of extending from ICamera, sometimes is easier to extend from CameraStatic))

You can have more than one camera added to the current IWorld’s CameraManager, but only one is active at time (=P)

The following example shows how to add more than one camera in the IWorld and smoothly navigate between them: (this part is very intutive, so we wont bother you with obvious comments)

using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using PloobsEngine;
using PloobsEngine.Cameras;
using PloobsEngine.Commands;
using PloobsEngine.DataStructure;
using PloobsEngine.Input;
using PloobsEngine.Light;
using PloobsEngine.Material;
using PloobsEngine.Modelo;
using PloobsEngine.Physics;
using PloobsEngine.Physics.Bepu;
using PloobsEngine.SceneControl;
using PloobsEngine.Utils;
using PloobsEngine.Engine;

namespace IntroductionDemo4._0
{
    ///
    /// Camera Screen
    ///
    public class CameraScreens : IScene
    {
        BindKeyCommand bk;

        ///
        /// Circular list that holds the cameras (Circular list is a PloobsEngine build in data structure, we will talk about all of them in other tutorial)
        ///
        private CircularList camerasNames = new CircularList(3);

        protected override void SetWorldAndRenderTechnich(out IRenderTechnic renderTech, out IWorld world)
        {
            world = new IWorld(new BepuPhysicWorld(-9.8f, true), new SimpleCuller());

            DeferredRenderTechnicInitDescription desc = DeferredRenderTechnicInitDescription.Default();
            desc.UseFloatingBufferForLightMap = true;
            desc.BackGroundColor = Color.CornflowerBlue;
            renderTech = new DeferredRenderTechnic(desc);
        }

        protected override void LoadContent(PloobsEngine.Engine.GraphicInfo GraphicInfo, PloobsEngine.Engine.GraphicFactory factory, IContentManager contentManager)
        {
            base.LoadContent(GraphicInfo, factory, contentManager);                        

            #region Models

            ///Cria uma textura 1x1 com a cor branca
            Texture2D white = factory.CreateTexture2DColor(1,1, Color.White);
            {
                SimpleModel sm = new SimpleModel(factory, "..\\Content\\Model\\cubo");
                sm.SetTexture(white, TextureType.DIFFUSE);

                BoxObject pi = new BoxObject(new Vector3(100, 20, 0), 1,1,1, 5,new Vector3(100, 5, 100),Matrix.Identity,MaterialDescription.DefaultBepuMaterial());
                DeferredNormalShader shader = new DeferredNormalShader();
                ///Setando alguns parametros do material
                shader.SpecularIntensity = 0.01f;
                shader.SpecularPower = 50;
                IMaterial mat = new DeferredMaterial(shader);
                IObject obj3 = new IObject(mat, sm, pi);
                this.World.AddObject(obj3);
            }

            {
                SimpleModel sm = new SimpleModel(factory,"..\\Content\\Model\\cubo");
                sm.SetTexture(white, TextureType.DIFFUSE);

                BoxObject pi = new BoxObject(new Vector3(90, 30, 0), 1,1,1, 10,new Vector3(1),Matrix.Identity,MaterialDescription.DefaultBepuMaterial());
                DeferredNormalShader shader = new DeferredNormalShader();                

                IMaterial mat = new DeferredMaterial(shader);
                IObject obj3 = new IObject(mat, sm, pi);
                this.World.AddObject(obj3);
            }

            {
                SimpleModel sm = new SimpleModel(factory,"..\\Content\\Model\\cenario");
                IPhysicObject pi = new TriangleMeshObject(sm,Vector3.Zero,Matrix.Identity,Vector3.One,MaterialDescription.DefaultBepuMaterial());
                DeferredNormalShader shader = new DeferredNormalShader();
                IMaterial mat = new DeferredMaterial(shader);
                IObject obj3 = new IObject(mat, sm, pi);
                this.World.AddObject(obj3);
            }

            #endregion                                    

            #region NormalLight
            ///Conjunto de luzes direcionais
            DirectionalLightPE ld1 = new DirectionalLightPE(Vector3.Left, Color.White);
            DirectionalLightPE ld2 = new DirectionalLightPE(Vector3.Right, Color.White);
            DirectionalLightPE ld3 = new DirectionalLightPE(Vector3.Backward, Color.White);
            DirectionalLightPE ld4 = new DirectionalLightPE(Vector3.Forward, Color.White);
            DirectionalLightPE ld5 = new DirectionalLightPE(Vector3.Down, Color.White);
            float li = 0.4f;
            ld1.LightIntensity = li;
            ld2.LightIntensity = li;
            ld3.LightIntensity = li;
            ld4.LightIntensity = li;
            ld5.LightIntensity = li;
            this.World.AddLight(ld1);
            this.World.AddLight(ld2);
            this.World.AddLight(ld3);
            this.World.AddLight(ld4);
            this.World.AddLight(ld5);
            #endregion

            ///Creating the first Static Camera
            CameraStatic camx = new CameraStatic(new Vector3(130, 100, 700), Vector3.Zero);
            ///Naming it (To recover later)
            camx.Name = "default";
            camx.FarPlane = 3000;
            ///Adding to the manager (ITS NOT BEING ACTIVATED, JUST ADDED)
            this.World.CameraManager.AddCamera(camx, camx.Name);
            ///NOW ACTIVATING=P (If we add a camera using World.AddCamera(cam) we automatically set this camera as active)
            this.World.CameraManager.SetActiveCamera(camx.Name);
            ///Add to the circular list
            camerasNames.Value = camx.Name;
            camerasNames.Next();          

            ///Same for the second camera (this is not activated)
            CameraStatic cam2 = new CameraStatic(new Vector3(100, 100, 100), Vector3.Zero);
            cam2.Name = "StaticCamera";
            cam2.FarPlane = 3000;
            this.World.CameraManager.AddCamera(cam2, cam2.Name);
            camerasNames.Value = cam2.Name;
            camerasNames.Next();

            ///Again ...
            CameraStatic cam3 = new CameraStatic(new Vector3(500, 300, 300), Vector3.Zero);
            cam3.Name = "StaticCamera3";
            cam3.FarPlane = 3000;
            this.World.CameraManager.AddCamera(cam3, cam3.Name);
            camerasNames.Value = cam3.Name;
            camerasNames.Next();
            ///When pressing SPACE, a function will be called, WE COULD use the screen binding (but we did not ... no specific reason ....)
            SimpleConcreteKeyboardInputPlayable ikp = new SimpleConcreteKeyboardInputPlayable(StateKey.PRESS, Keys.Space, KeyStateChange);
            bk = new BindKeyCommand(ikp, BindAction.ADD);
            CommandProcessor.getCommandProcessor().SendCommandAssyncronous(bk);
        }

        protected override void Draw(GameTime gameTime, RenderHelper render)
        {
            base.Draw(gameTime, render);
            render.RenderTextComplete("Demo: Preset Cameras", new Vector2(GraphicInfo.Viewport.Width - 315, 15), Color.White,Matrix.Identity);
            render.RenderTextComplete("Space = Move to next camera", new Vector2(GraphicInfo.Viewport.Width - 315, 40), Color.White, Matrix.Identity);
        }

        ///
        /// When Escape is pressed
        ///
        ///
        void KeyStateChange(InputPlayableKeyBoard ipk)
        {
            ///TO CHANGE ONLY IN THE END OF THE INTERPOLATION
            //if (mundo.CameraManager.ActiveCameraType != State.INTERPOLATING)
            //{
                //camerasNames.Next();
                //mundo.CameraManager.SetActiveCamera(camerasNames.Value,InterpolationType.BYSTEP, 0.005f);
                //mundo.CameraManager.SetActiveCamera(camerasNames.Value, InterpolationType.BYTIME, 3);
            //}

            ///Advance on position in the circular list
            camerasNames.Next();
            ///Activate the current camera in the circular list
            ///There are two types of interpolator (take care of the camera transition smoothly). The first takes a fixed time (BYTIME( to make the transition and the second use a fixed speed (BYSTEP))
            this.World.CameraManager.SetActiveCamera(camerasNames.Value, InterpolationType.BYTIME, 3);
        }

        protected override void CleanUp(EngineStuff engine )
        {
            bk.BindAction = BindAction.REMOVE;
            CommandProcessor.getCommandProcessor().SendCommandAssyncronous(bk);
        }

    }
}

Pretty easy =P In the IntroductionDemos you can find this sample and another one showing how to record a path and play it after.

Lights

As said in the beggining, Lights are only avaliable if you choose the DeferredRenderTechnich. We have the following Light Types avaliable: (we wont explain what each light is, good reference for this are: http://robertokoci.com/basics-of-light-in-3d-computer-graphics/ and in this marvelous book http://www.realtimerendering.com/book.html)

  • DirectionalLightPE
  • PointLightPE
  • SpotLightPE

The silly name DirectionalLightPE is used because in XNA 4.0, the xna already has a class called DirectionalLight, so to avoid confusion we changed the name (PE = Ploobs Engine =P)

We use Phong Equation to calculate each light contribuition. This blog post from Catalin Zilma shows some implementation details (if you want to play with any deferred rending light code, first look at that post) , we used a slightly diferent aproach.

The Directional Light and the SpotLight can cast Shadow (we will talk about it in the future =P).

You can create your own lights, but it is not simple, you need to extend ILight,extend IDeferredLightMap and create a shader that procces you light and create the light map for it. (we will talk about this in other tutorial).

The Introduction packages has some samples explaining how to add, remove and customize the behavior of the lights. We wont show them here cause this is very straightforward, instead we will show a simple but very interesting sample that integrates lights and physics.

Ball Throw Example

We will build a sample with the following behavior:

  • When left mouse button is clicked, a ball with a point light attached to it will be throw in the direction of the camera target vector
  • When right mouse button is clicked, a point light is placed in the current cameras position

This sample with show lots of things we already seen in last tutorials.

To begin, we need to extend the Point Light, cause we need to update its position every frame according to the Ball. The implementation is show bellow:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using PloobsEngine.Light;
using PloobsEngine.Physics;

namespace AdvancedDemo4._0
{
    ///
    /// Point light that follow an object
    ///
    public class MoveablePointLight : PointLightPE
    {

        IPhysicObject ob;

        public MoveablePointLight(IPhysicObject obj, Color color, float lightRadius, float lightIntensity)
            : base(obj.Position, color, lightRadius, lightIntensity)
        {
            this.ob = obj;
        }

        public override Vector3 LightPosition
        {
            get
            {
                return ob.Position;
            }
            set
            {
                ob.Position = value;
            }
        }

    }
}

We just overrided the LightPosition property, return the object position instead of the light static position.

The following code shows how to bind the mouse buttons, create the ball and the point light.

using System;
using PloobsEngine.SceneControl;
using PloobsEngine;
using PloobsEngine.Input;
using Microsoft.Xna.Framework;
using PloobsEngine.Physics.Bepu;
using PloobsEngine.Modelo;
using PloobsEngine.Material;
using Microsoft.Xna.Framework.Graphics;
using PloobsEngine.Utils;
using PloobsEngine.Commands;
using Microsoft.Xna.Framework.Input;
using PloobsEngine.Light;
using PloobsEngine.Engine;
using PloobsEngine.Physics;

namespace EngineTestes
{
    public class LightThrowBepu
    {
        IWorld _mundo;
        Random rd = new Random();
        BindMouseCommand mm0 = null;
        BindMouseCommand mm1 = null;
        GraphicFactory factory;

        public void CleanUp()
        {
            mm0.BindAction = BindAction.REMOVE;
            CommandProcessor.getCommandProcessor().SendCommandAssyncronous(mm0);

            mm1.BindAction = BindAction.REMOVE;
            CommandProcessor.getCommandProcessor().SendCommandAssyncronous(mm1);
        }        

        public LightThrowBepu(IWorld mundo,GraphicFactory factory)
        {
            this.factory = factory;
            _mundo = mundo;
            {
                ///Register a function to be called when the the mouse is pressed
                InputPlaybleMouseBottom ip1 = new SimpleConcreteMouseBottomInputPlayable(StateKey.PRESS, EntityType.IOBJECT, MouseButtons.LeftButton, mousebuttonteste);
                mm0 = new BindMouseCommand(ip1, BindAction.ADD);
                CommandProcessor.getCommandProcessor().SendCommandAssyncronous(mm0);
            }
            {
                InputPlaybleMouseBottom ip = new SimpleConcreteMouseBottomInputPlayable(StateKey.PRESS, EntityType.IOBJECT, MouseButtons.RightButton, mousebuttontesteRight);
                mm1 = new BindMouseCommand(ip, BindAction.ADD);
                CommandProcessor.getCommandProcessor().SendCommandAssyncronous(mm1);
            }

        }

        public void mousebuttontesteRight(MouseState ms)
        {
            PointLightPE pl = new PointLightPE(_mundo.CameraManager.ActiveCamera.Position, StaticRandom.RandomColor(), 100, 5);
            pl.UsePointLightQuadraticAttenuation = true;
            _mundo.AddLight(pl);
        }

        int i = 0;
        public void mousebuttonteste(MouseState ms)
        {
            ///Create an object
            IObject physObj = SpawnPrimitive(_mundo.CameraManager.ActiveCamera.Position, Matrix.CreateRotationX(0.5f));
            physObj.PhysicObject.Velocity = (_mundo.CameraManager.ActiveCamera.Target - _mundo.CameraManager.ActiveCamera.Position) * 15.0f;

            ///Create a light that follow an object
            MoveablePointLight mvp = new MoveablePointLight(physObj.PhysicObject as SphereObject, new Color((float)rd.NextDouble(),(float) rd.NextDouble(),(float) rd.NextDouble()),25, 5);
            mvp.UsePointLightQuadraticAttenuation = true;
            ///Add them to the world
            _mundo.AddLight(mvp);
            physObj.Name = "FlyingBall " + ++i;
            _mundo.AddObject(physObj);

        }
        ///
        /// Create a simple Sphere object
        ///
        ///

        ///

        ///
        private IObject SpawnPrimitive(Vector3 pos, Matrix ori)
        {
            ///Load a Model with a custom texture
            SimpleModel sm2 = new SimpleModel(factory,"Model\\ball");
            sm2.SetTexture(factory.CreateTexture2DColor(1,1,Color.White,false), TextureType.DIFFUSE);
            DeferredNormalShader nd = new DeferredNormalShader();
            IMaterial m = new DeferredMaterial(nd);
            SphereObject  pi2 = new SphereObject(pos, 1,0.5f,1,MaterialDescription.DefaultBepuMaterial());
            IObject o = new IObject(m,sm2,pi2);
            return o;
        }

    }
}

Nothing new here =P, just the same stuff we learned from previous tutorials.

The code for this demo can be found in our Introduction Demos package (called LightThrowBepu.cs and MoveablePointLight.cs), you can download it here. (there are lots of others demos in this package from the previous tutorials =P).

Any doubts, critics, suggestions, pls go to our forum or leave a comment here.

See you guys =P

Links

 

, , , , , ,

  1. #1 by Van on 24 de julho de 2016 - 11:15 am

    Wow, this paragraph is pleasant, my younger sister
    is analyzing these things, therefore I am going to tell her.

  2. #2 by Andy on 24 de julho de 2016 - 11:16 am

    Thus, rather than reaching for a candy bar, someone taking Garcinia Cambogia is more likely to make a
    healthier choice including vegetable or a fruit, or a
    lean protein source.

  3. #3 by http://www.lasnoticiasdemalleco.cl/?option=com_k2&view=itemlist&task=user&id=77515 on 24 de julho de 2016 - 11:17 am

    Recognizing and also building your telepathic abilities may be an enormous support in materializing the life that you intend.

  4. #4 by Joycelyn on 24 de julho de 2016 - 11:17 am

    Today, I went to the beach with my children. I found a sea
    shell and gave it to my 4 year old daughter and
    said “You can hear the ocean if you put this to your ear.”
    She placed the shell to her ear and screamed. There was a
    hermit crab inside and it pinched her ear. She never wants to go
    back! LoL I know this is totally off topic but
    I had to tell someone!

  5. #5 by Modesto on 24 de julho de 2016 - 11:25 am

    The complete benefit of Garcinia Cmabogia is that it’s a fat
    burner as well as an appetite suppressant.

  6. #6 by water pump on 24 de julho de 2016 - 11:26 am

    Hi there, You’ve performed a great job. I’ll definitely digg it
    and personally suggest to my friends. I’m confident they will be benefited from this web
    site.

  7. #7 by nplab.kumoh.ac.kr on 24 de julho de 2016 - 11:28 am

    hello there and thank you for your information ? I’ve definitely picked up anything new from right
    here. I did however expertise a few technical points using this site, since I experienced to reload the website lots of times previous to I could get it to load correctly.
    I had been wondering if your hosting is OK?
    Not that I am complaining, but sluggish loading instances times will very
    frequently affect your placement in google and can damage
    your high-quality score if advertising and marketing with Adwords.
    Anyway I’m adding this RSS to my email and can look out for
    a lot more of your respective fascinating content.
    Make sure you update this again very soon.

  8. #8 by sciencecasenet.org on 24 de julho de 2016 - 11:30 am

    It’s really a nice and useful piece of information. I’m happy that
    you shared this helpful information with us. Please keep us up to date like
    this. Thank you for sharing.

  9. #9 by Earnestine on 24 de julho de 2016 - 11:32 am

    Merely wanna remark on few general things, The website design and style is
    perfect, the subject material is very fantastic :D.

  10. #10 by garcinia cambogia extract walmart.ca on 24 de julho de 2016 - 11:38 am

    These findings are exactly what researchers published in the Journal of Obesity
    in 2011: When they compared people who took garcinia cambogia extract to
    those who didn’t, the weight difference was quite small
    (on average just about two pounds).

  11. #11 by pump on 24 de julho de 2016 - 11:40 am

    Hi there! This article couldn’t be written any better!
    Reading through this article reminds me of my previous roommate!

    He always kept talking about this. I will forward this
    information to him. Pretty sure he will have a good read.
    Many thanks for sharing!

  12. #12 by http://www.morethandancers.com on 24 de julho de 2016 - 11:41 am

    I was able to find good advice from your blog articles.

  13. #13 by what are healthy diet foods on 24 de julho de 2016 - 11:41 am

    Wow, superb weblog format! How lengthy have you ever been running a blog for?
    you made blogging glance easy. The entire look of your website is fantastic, let alone the content material!

  14. #14 by www.gaiaonline.com on 24 de julho de 2016 - 11:44 am

    Valuable info. Lucky me I discovered your site by
    chance, and I am surprised why this accident didn’t took place earlier!

    I bookmarked it.

  15. #15 by Orville on 24 de julho de 2016 - 11:44 am

    Hey exceptional website! Does running a blog like this take a lot of work?
    I have very little understanding of programming but I was
    hoping to start my own blog soon. Anyways, should
    you have any recommendations or tips for new blog owners please share.
    I understand this is off topic but I simply wanted to ask.

    Appreciate it!

  16. #16 by jobs govt kpk on 24 de julho de 2016 - 11:45 am

    Thank you for the good writeup. It in reality was once a
    leisure account it. Glance complex to more added agreeable from you!
    By the way, how could we communicate?

  17. #17 by Fred on 24 de julho de 2016 - 11:47 am

    Really clean website, thank you for this post.

  18. #18 by http://www.doors-safety.gr/ on 24 de julho de 2016 - 11:48 am

    SylviaSky, I didn’t spent a cent to Chris, only answered on his
    ad for FREEE READIG, As well as yes his words expose every
    bit of a hoax, after so many individuals obtained the particular
    same content. a lot better join, view it yourself, expense absolutely nothing, discover exactly how fast
    he is actually affixed to you and contacts you his best
    friend, Bet every words are going to match with those twenty or
    even additional mail he sent to me in a lot less after
    that 2 weeks time, just before I unsubscribed.

  19. #19 by http://www.biantaila.com on 24 de julho de 2016 - 11:52 am

    I’m truly enjoying the design and layout of your blog.
    It’s a very easy on the eyes which makes it much more enjoyable for me to come here and visit more often. Did you hire out a developer to
    create your theme? Fantastic work!

  20. #20 by kurekure90.myblog.de on 24 de julho de 2016 - 11:52 am

    This post offers clear idea in favor of the new people of blogging,
    that genuinely how to do running a blog.

  21. #21 by www.themusicverse.com on 24 de julho de 2016 - 12:01 pm

    I couldn’t refrain from commenting. Perfectly written!

  22. #22 by www.myxynr.com on 24 de julho de 2016 - 12:06 pm

    There are also a variety of other agencies that you can easily disclose this to – as an example, you
    can easily attempt having her to tiny cases court of law, or even to disclose this to the Better Business Bureau
    as well as any Condition company licensing agencies … she is probably functioning
    without a permit and also can be put out of working on this basis.

  23. #23 by what is some healthy food on 24 de julho de 2016 - 12:07 pm

    Undeniably imagine that which you said. Your favourite reason seemed to be at the internet
    the simplest thing to take into accout of. I say to you, I definitely get
    annoyed even as other people consider issues that
    they just do not understand about. You controlled to hit the
    nail upon the highest as neatly as outlined out the entire thing without having side-effects ,
    other folks could take a signal. Will likely be back
    to get more. Thank you

  24. #24 by garcinia cambogia weight management pills on 24 de julho de 2016 - 12:14 pm

    When you then combine the proper Garcinia Cambogia dosage and the
    Colon Cleanse you are getting the best of both worlds.

  25. #25 by Flor on 24 de julho de 2016 - 12:18 pm

    Excellent beat ! I wish to apprentice even as you
    amend your website, how can i subscribe for a blog website?

    The account aided me a appropriate deal. I were tiny bit familiar of this your broadcast offered brilliant transparent concept

  26. #26 by Harvey on 24 de julho de 2016 - 12:20 pm

    Currently it sounds like Movable Type is the preferred blogging platform available right now.
    (from what I’ve read) Is that what you are using on your blog?

  27. #27 by www.ixiaoma.com on 24 de julho de 2016 - 12:27 pm

    As various other Telepathic Readers perform at houseparty, Edward is going to perform private
    readings for individuals at our home celebrations.

  28. #28 by Chrinstine on 24 de julho de 2016 - 12:30 pm

    Hello, I read your blog on a regular basis. Your story-telling style is
    witty, keep doing what you’re doing!

  29. #29 by pokemon go hack ios on 24 de julho de 2016 - 12:33 pm

    However, this virus is more concerned with gamers around the world stealing their confidential and other
    financial credentials and gain access to
    their accounts. One of the resultant effects of this is the growth of websites with links to playing online
    games or those that are completely dedicated to the games itself.
    Here we are going to take a look at the best actual Scrabble games that
    are free online, authorized by Hasbro, Inc.

  30. #30 by shaft seals goods on 24 de julho de 2016 - 12:35 pm

    Hi to all, how is everything, I think every one is getting
    more from this site, and your views are pleasant in support of new
    people.

  31. #31 by malarnia proszkowa sroda wielkopolska on 24 de julho de 2016 - 12:36 pm

    Commercial Grade Construction and Performance.

  32. #32 by immobilierAntibes on 24 de julho de 2016 - 12:38 pm

    It’s really very complex in this busy life
    to listen news on TV, therefore I simply use the web for that purpose, and
    obtain the newest news.

  33. #33 by okgist.com.ng on 24 de julho de 2016 - 12:38 pm

    I constantly spent my half an hour to read this weblog’s posts
    all the time along with a mug of coffee.

  34. #34 by www.Fwfpc.org on 24 de julho de 2016 - 12:40 pm

    I was reading through some of your content on this website and I believe this internet site is really informative!
    Keep on posting.

  35. #35 by Smart Balance Wheel on 24 de julho de 2016 - 12:42 pm

    Livraison rapide, Smart Balance Wheel http://www.fashionhoverboard.com conforme au descriptif. Efficace !

  36. #36 by http://www.snipersgame.com/index.php?task=profile&id=2096797 on 24 de julho de 2016 - 12:47 pm

    The Marks family members saga in San Diego times, thus several various other San Diego families, to the 1940s when the urban area was experiencing swift expansion and also business options abounded.

  37. #37 by website on 24 de julho de 2016 - 12:51 pm

    If you desire to get a good deal from this piece of
    writing then you have to apply such strategies to your won website.

  38. #38 by Emilio on 24 de julho de 2016 - 1:08 pm

    I wanted to follow along and let you know how much
    I cherished discovering this blog today. I’d personally consider it an honor
    to operate at my workplace and be able to operate on the
    tips contributed on your web site and also take part in visitors’ remarks like this.
    Should a position connected with guest writer become offered
    at your end, remember to let me know.

  39. #39 by Adwin.Com on 24 de julho de 2016 - 1:14 pm

    I like this website very much so much wonderful info.

  40. #40 by world best healthy food on 24 de julho de 2016 - 1:19 pm

    It’s going to be end of mine day, however before ending I am reading this great piece of writing to increase my know-how.

  41. #41 by blog.inspirationemporium.com on 24 de julho de 2016 - 1:26 pm

    Hi, its pleasant piece of writing about media print, we all know media is
    a fantastic source of facts.

  42. #42 by mylifeair.com on 24 de julho de 2016 - 1:26 pm

    I love what you guys are usually up too. This kind of
    clever work and coverage! Keep up the great works
    guys I’ve incorporated you guys to my own blogroll.

  43. #43 by Clarita on 24 de julho de 2016 - 1:27 pm

    Our company possess a substantial choice from premier consultants which offer
    clairvoyant readings along with a wide range from abilities and also know-how.

  44. #44 by Angel on 24 de julho de 2016 - 1:27 pm

    Some other things that can indicate psychic eyesight:
    possessing vibrant dreams, sights, remembrances as well as mini-movies that show off in your recognition; observing the shades
    from the power areas around individuals, plants, and creatures; possessing an outstanding sense of direction; easily visualizing options to issues; and/or being actually truly great along
    with visual-spatial troubles, like changing household furniture or even filling the dishwasher.

  45. #45 by stepio.com on 24 de julho de 2016 - 1:29 pm

    Hello, its good piece of writing concerning media print, we all know media is
    a great source of information.

  46. #46 by healthy things to eat on a diet on 24 de julho de 2016 - 1:30 pm

    This info is priceless. Where can I find out more?

  47. #47 by Binary Profit System on 24 de julho de 2016 - 1:34 pm

    Thanks for another fantastic post. Where else could anyone get that type of information in such a perfect way of writing?

    I’ve a presentation next week, and I am at the search for such information.

1 379 380 381
(não será publicado)