Quantcast
Channel: Community | MonoGame - Latest topics
Viewing all 6821 articles
Browse latest View live

Hardware Options (Cheap and small) to run mongame 2d project?

$
0
0

@mgerety wrote:

All,

I've written software for my skeeball machine in MonoGame and am currently running it on an old, crappy PC. It's big and sucks power.

http://forum.arcadecontrols.com/index.php/topic,156300.0.html

I'd really love to get it running on a single-board computer like a odroid or RPI 3b+ (or whatever else would work). I've had trouble getting monogame working with openglES on a RPI3. Is that my best bet, or are there any other suggestions for hardware that would work? Cost and size are the primary drivers here.

My goal is to offer an image for distribution to users of the software that makes it very easy to integrate into an existing skeeball machine.

Thanks for any and all suggestions.

Posts: 1

Participants: 1

Read full topic


Windows UWP Ads

$
0
0

@Paul_Crawley wrote:

I've been trying to get uwp ads working but am getting an exception when I call the show from outside of the game.xaml.cs file, heres the code

  public sealed partial class GamePage : Page
  {
    private readonly Game1 _game;

    private static InterstitialAd myInterstitialAd;
    private static string myAppId = "d25517cb-12d4-4699-8bdc-52040c712cab";
    private static string myAdUnitId = "test";
    public static bool adIsReady;
    public static bool adTrigger;
    public static AdType adType;

    public GamePage()
    {
      InitializeComponent();

      // Create the game.
      string launchArguments = string.Empty;
      _game = MonoGame.Framework.XamlGame<Game1>.Create(launchArguments,Window.Current.CoreWindow,swapChainPanel);


      myInterstitialAd = new InterstitialAd();

      adType = AdType.Display;                                                                      // carful using this phones can be twitchy if set to Display      

      myInterstitialAd.AdReady += MyInterstitialAd_AdReady;
      myInterstitialAd.ErrorOccurred += MyInterstitialAd_ErrorOccurred;
      myInterstitialAd.Completed += MyInterstitialAd_Completed;
      myInterstitialAd.Cancelled += MyInterstitialAd_Cancelled;
      myInterstitialAd.RequestAd(adType,myAppId,myAdUnitId);
      Game1.interstitialAd = myInterstitialAd;

      // Try making an instance and using that to do all this?

    }

    // ERROR EXCEPTION WHEN CALLING THIS FROM GAME1.CS 

    public static void ShowAd(InterstitialAd ad)
    {
      if(InterstitialAdState.Ready == ad.State)
      {
        ad.Show(); // EXCEPTION AT THIS CALL? HELP!
        adTrigger = false;
      }
    }
    private void MyInterstitialAd_AdReady(object sender,object e)
    {
      adIsReady = true;
      if(InterstitialAdState.Ready == myInterstitialAd.State)
      {
        //        myInterstitialAd.Show();                                                                  // show the ad 
        adTrigger = true;
//        ShowAd();
      }
    }
    private void MyInterstitialAd_ErrorOccurred(object sender,AdErrorEventArgs e)
    {
      adIsReady = false;
      throw new System.Exception("Failed to load ad:- GamePage.xaml.cs");
      // handle an error
    }
    private void MyInterstitialAd_Completed(object sender,object e)
    {
      adIsReady = false;
      // load the next ad
      myInterstitialAd.RequestAd(adType,myAppId,myAdUnitId);
    }
    private void MyInterstitialAd_Cancelled(object sender,object e)
    {
      adIsReady = false;
      // load the next ad
      myInterstitialAd.RequestAd(adType,myAppId,myAdUnitId);
    }
  }

Yet if I put the show() inside the AdReady call it works just fine, no bloody good if I want to show ads after a level, basically any ideas how as in admob I can preload the ad, then show it when I want to? ive read pretty much every example but no one actually does a real world example where a straight call in the middle of a running program an ad can be triggered.
Thanks in advance
Paul

Posts: 1

Participants: 1

Read full topic

Monogame Jam

$
0
0

@FreedeX_Official wrote:

Hello everyone, I only found out now of the existence of monogame jam, but I don't know what is it... someone can tell me what is it?

Posts: 2

Participants: 2

Read full topic

IDrawable.Draw(GameTime gt) to Draw(GameTime gt, SpriteBatch sb)?

$
0
0

@J_Mor wrote:

Hi, I've been poking around MonoGame over the summer, and recently came across the IGameComponent interface. I want to try implementing this, along with IUpdatable and IDrawable in my 2D game, but I have no idea how to pass in the SpriteBatch to the GameComponents like I've always done. Any ideas/workarounds/suggestions?

Posts: 4

Participants: 3

Read full topic

Vertex buffer and camera matrix problem

$
0
0

@CSharpCoder wrote:

I'm currently optimizing drawing my tiled map, so instead of calling SpriteBatch.Draw for all of the tiles, I'm going to use a vertex and index buffer. As a test I just tried to draw one tile, but the camera view matrix screws it up (drawing without it works fine). When I use the camera view matrix with SpriteBatch.Draw it works fine.

TiledMap.TileSize is 16

This is my Draw function

`protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(backgroundColor);

        var basicEffect = new BasicEffect(GraphicsDevice);
        basicEffect.TextureEnabled = true;
        basicEffect.VertexColorEnabled = false;
        basicEffect.World = Matrix.Identity;

        int tx = 176;
        int ty = 496;
        var rect = new Rectangle(0, 0, TiledMap.TileSize, TiledMap.TileSize);

        basicEffect.View = Scene.Camera.TransformMatrix;
        basicEffect.Projection = Matrix.CreateOrthographicOffCenter(0, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, -1);
        basicEffect.Texture = Content.Load<Texture2D>("Textures/Tiles/collisionmask");

        var vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionTexture), 4, BufferUsage.WriteOnly);
        var indexBuffer = new IndexBuffer(GraphicsDevice, typeof(short), 6, BufferUsage.WriteOnly);

        var vertices = new VertexPositionTexture[4]
        {
            new VertexPositionTexture(new Vector3(tx, ty + TiledMap.TileSize, 0), new Vector2(rect.Left, rect.Bottom)),
            new VertexPositionTexture(new Vector3(tx, ty, 0), new Vector2(rect.Left, rect.Top)),
            new VertexPositionTexture(new Vector3(tx + TiledMap.TileSize, ty + TiledMap.TileSize, 0), new Vector2(rect.Right, rect.Bottom)),
            new VertexPositionTexture(new Vector3(tx + TiledMap.TileSize, ty, 0), new Vector2(rect.Right, rect.Top))
        };
        var indices = new short[6]
        {
            0, 1, 2,
            2, 1, 3
        };

        vertexBuffer.SetData(vertices);
        indexBuffer.SetData(indices);

        GraphicsDevice.SetVertexBuffer(vertexBuffer);
        GraphicsDevice.Indices = indexBuffer;

        foreach (var pass in basicEffect.CurrentTechnique.Passes)
        {
            pass.Apply();
            GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 2);
        }

        vertexBuffer.Dispose();
        indexBuffer.Dispose();

        base.Draw(gameTime);
    }`

And this is how the camera matrix is calculated (PixelsPerUnit = 1)

`protected virtual void UpdateMatrices()
{
if (!matricesDirty)
return;

        // Translate position
        transformMatrix = Matrix.CreateTranslation(-transform.Position.X, -transform.Position.Y, 0) *
            Matrix.CreateScale(PixelsPerUnit, PixelsPerUnit, 1);
        if (zoom != 1)
            transformMatrix *= Matrix.CreateScale(zoom, zoom, 1); // Scale by zoom
        transformMatrix *= Matrix.CreateScale(Screen.scale.X, Screen.scale.Y, 1);
        transformMatrix *= Matrix.CreateTranslation(view.Width * 0.5f, view.Height * 0.5f, 0);
        // Calculate our inverse as well
        inverseTransformMatrix = Matrix.Invert(transformMatrix);

        matricesDirty = false;
    }`

Posts: 2

Participants: 1

Read full topic

Why is XNA dead?

Vertex Buffer is not any faster than SpriteBatch

$
0
0

@CSharpCoder wrote:

In a 2D tile-based platformer I tried drawing all of my tiles using a vertex and index buffer with DrawIndexedPrimitives instead of a spritebatch because I heard it was MUCH faster, but it's not faster than just using a spritebatch (it has the same CPU usage). First the TileAtlasBuffer is initialized, then all the tiles are added with AddTile (each tile is represented as a textured quad) and SetData is called. After that only the Draw method is called again. Specifically DrawIndexedPrimitives is no faster than just drawing all the tiles one by one with spritebatch. What am I doing wrong?

`

    private class TileAtlasBuffer
    {
        public Texture2D texture;
        public VertexBuffer vertexBuffer;
        public IndexBuffer indexBuffer;
        private VertexPositionTexture[] vertices;
        private short[] indices;
        private int tileCount;
        private GraphicsDevice GraphicsDevice
        {
            get { return Core.Instance.GraphicsDevice; }
        }
        public TileAtlasBuffer(Texture2D texture, int tiles)
        {
            this.texture = texture;
            vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionTexture), tiles * 4, 
                BufferUsage.WriteOnly);
            indexBuffer = new IndexBuffer(GraphicsDevice, typeof(short), tiles * 6, BufferUsage.WriteOnly);
            vertices = new VertexPositionTexture[tiles * 4];
            indices = new short[tiles * 6];
            tileCount = 0;
        }

        public void SetData()
        {
            vertexBuffer.SetData(vertices);
            indexBuffer.SetData(indices);
        }

        public void Draw(BasicEffect basicEffect)
        {
            if (tileCount > 0)
            {
                GraphicsDevice.SetVertexBuffer(vertexBuffer);
                GraphicsDevice.Indices = indexBuffer;

                basicEffect.Texture = texture;
                foreach (var pass in basicEffect.CurrentTechnique.Passes)
                {
                    pass.Apply();
                    GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, tileCount * 2);
                }
            }
        }

        public void AddTile(int tx, int ty, Rectangle rect, bool flippedHorizontally, bool flippedVertically)
        {
            float textureSizeX = 1f / texture.Width;
            float textureSizeY = 1f / texture.Height;

            float left = rect.Left * textureSizeX;
            float right = rect.Right * textureSizeX;
            float bottom = rect.Bottom * textureSizeY;
            float top = rect.Top * textureSizeY;

            if (flippedHorizontally)
            {
                float temp = left;
                left = right;
                right = temp;
            }
            if (flippedVertically)
            {
                float temp = top;
                top = bottom;
                bottom = temp;
            }

            int vertexCount = tileCount * 4;
            vertices[vertexCount] = new VertexPositionTexture(new Vector3(tx, ty + rect.Height, 0), new Vector2(left, bottom));
            vertices[vertexCount + 1] = new VertexPositionTexture(new Vector3(tx, ty, 0), new Vector2(left, top));
            vertices[vertexCount + 2] = new VertexPositionTexture(new Vector3(tx + rect.Width, ty + rect.Height, 0), new Vector2(right, bottom));
            vertices[vertexCount + 3] = new VertexPositionTexture(new Vector3(tx + rect.Width, ty, 0), new Vector2(right, top));

            int indexCount = tileCount * 6;
            indices[indexCount] = (short)vertexCount;
            indices[indexCount + 1] = (short)(vertexCount + 1);
            indices[indexCount + 2] = (short)(vertexCount + 2);

            indices[indexCount + 3] = (short)(vertexCount + 2);
            indices[indexCount + 4] = (short)(vertexCount + 1);
            indices[indexCount + 5] = (short)(vertexCount + 3);

            tileCount++;
        }
    }`

Posts: 13

Participants: 3

Read full topic

Does the order of the vertices/indices in a Vertex/IndexBuffer determine the draw order?

$
0
0

@CSharpCoder wrote:

In a 2D tile-based platformer I'm drawing all of my tiles using a vertex and index buffer with DrawIndexedPrimitives. I'm trying to make as few draw calls as possible, but some of the tiles are on a different layer than others and thus has to be drawn on top of, or beneath other layers. If I only have to make a draw call for each different texture rather than each different texture for each different layer, that would be great.

Does the order of the vertices/indices in a Vertex/IndexBuffer determine the draw order?

Posts: 3

Participants: 3

Read full topic


Monogame Extended Tiled Scaling

$
0
0

@AnimaGames wrote:

I've read through the forum but can't find a dumbed down answer to how to scale up a Tiled map in MonoGame, my player sprites are being scaled up by 2 and I can't figure out how to get the tile importer/renderer to scale up the tiles. I don't want to zoom in with the camera or redraw the maps with larger tiles, I want to scale up the current tiles Thanks :slight_smile:

Posts: 1

Participants: 1

Read full topic

error building shader in linux

$
0
0

@HS_Dave wrote:

I have a working game that I wrote on my windows machine and I've copied the project across to a linux box I built (running mint with monodevelop and monogame+deps etc) and was surprised how out of the box my game appeared to be compiling - infact there is only one error.

The error is an unexpected error in the effects processor and its throwing a System.NotImplementedException but I have no idea what part of my (very simple) shader it feels is not implemented.

Here is a paste of my shader: https://hastebin.com/rogequroqa.cs

Any clues as to what it does not like?

Posts: 2

Participants: 2

Read full topic

Fastest way to programatically load a texture from a generated PNG file?

$
0
0

@Luna_Tuna wrote:

I've tried the FileStream trick but the call that takes all day (8 - 15 seconds) is Texture2D.FromStream()

I've tried others' loaders but they are all variations of this base method so they are even slower.

The application I'm writing is mathematical and I'm generating PNG images from LaTeX input on the fly using McTeK installed "latex.exe" and "dvipng.exe" on the Path.

Generating the PNG takes aboout 2 seconds! Who'd have thought the bottleneck would be loading the PNG IMAGE!!!

My first thought is to use the Pipelining tool and cache about 5,000 LaTeX -rendered PNGs of common expressions. If the object in the scene has to wait to render, then it will display the text "rendering $\mathbb{Z}$" or something...

But that is so shitty! Please provide me with the hack that speeds up loading PNGs for textures.

Thanks.

Posts: 1

Participants: 1

Read full topic

Instancing for particle system

$
0
0

@Sebastian_Stehle wrote:

Hi,

i try to optimize my particle system. Just for fun. I use a single vertex buffer and index buffer for all emitters and try to optimize it with instancing.

I have one vertex buffer for my quad (texture cordinates only) and the index buffer of course.

I also have a vertex buffer for my instances with position, rotation, color and size.

But it just does not render anything. My custom shader works, I tested it with the old rendering, but I am doing something wrong :frowning:

    public sealed class ParticleProcessor : BaseDrawingProcessor<ParticleComponent>
    {
        private const int NumParticlesPerRenderingCall = 4000;
        private IndexBuffer indexBuffer;
        private VertexBuffer vertexBuffer;
        private VertexBuffer instanceBuffer;
        private VertexBufferBinding vertexBufferBinding;
        private VertexBufferBinding instanceBufferBinding;
        private VertexBufferBinding[] bindings;
        private VertexPositionColorRotationSize[] instanceVertices;
        private ParticleEffect particleEffect;

        public override void LoadContent(Scene scene)
        {
            indexBuffer = new IndexBuffer(scene.GraphicsDevice, IndexElementSize.SixteenBits, 6, BufferUsage.None);
            indexBuffer.SetData(new long[] { 0, 1, 2, 0, 2, 3 });

            vertexBuffer = new VertexBuffer(scene.GraphicsDevice, typeof(VertexTexture), 4, BufferUsage.None);
            vertexBufferBinding = new VertexBufferBinding(vertexBuffer);
            vertexBuffer.SetData(new VertexTexture[]
            {
                new VertexTexture(new Vector2(0, 0)),
                new VertexTexture(new Vector2(1, 0)),
                new VertexTexture(new Vector2(1, 1)),
                new VertexTexture(new Vector2(0, 1)),
            });

            instanceVertices = new VertexPositionColorRotationSize[NumParticlesPerRenderingCall];
            instanceBuffer = new VertexBuffer(scene.GraphicsDevice, typeof(VertexPositionColorRotationSize), NumParticlesPerRenderingCall, BufferUsage.WriteOnly);
            instanceBufferBinding = new VertexBufferBinding(instanceBuffer, 0, 1);

            bindings = new VertexBufferBinding[] { vertexBufferBinding, instanceBufferBinding };

            particleEffect = new ParticleEffect(scene.Content.Load<Effect>("Effects/Particles"));
        }

        private void RenderJob(GraphicsDevice graphicsDevice, ParticleRenderingJob job, Matrix viewProjection)
        {
            graphicsDevice.Indices = indexBuffer;

            particleEffect.CurrentTechnique.Passes[0].Apply();

            var particleIndex = 0;

            unsafe
            {
                for (var i = 0; i < job.Particles.Length; i++)
                {
                    var particle = job.Particles[i];

                    if (particle->Lifetime > 0)
                    {
                        instanceVertices[particleIndex].Position = particle->Position;
                        instanceVertices[particleIndex].Rotation = particle->Rotation;
                        instanceVertices[particleIndex].Size.X = particle->Size;
                        instanceVertices[particleIndex].Size.Y = particle->Size;
                        instanceVertices[particleIndex].Color = particle->Color;

                        particleIndex++;

                        if (particleIndex == NumParticlesPerRenderingCall)
                        {
                            RenderMesh(graphicsDevice, particleIndex);

                            particleIndex = 0;
                        }
                    }
                }
            }

            RenderMesh(graphicsDevice, particleIndex);
        }

        private void RenderMesh(GraphicsDevice graphicsDevice, int numParticles)
        {
            if (numParticles > 0)
            {
                instanceBuffer.SetData(instanceVertices, 0, numParticles);

                graphicsDevice.SetVertexBuffers(bindings);
                graphicsDevice.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, 2, numParticles);
            }
        }
    }

What is confusing for me, is that the ordering of the vertex bindings matters. When I change the order I get the following execption: : 'An error occurred while preparing to draw. This is probably because the current vertex declaration does not include all the elements required by the current vertex shader. The current vertex declaration includes these elements: SV_Position0, COLOR0, COLOR1, TEXCOORD1, TEXCOORD0.'

Which is strange because it matchs to my shader:

struct VSInput
{
    float4 Position : SV_POSITION;
    float2 TexCoord : TEXCOORD0;
    float2 Size     : TEXCOORD1;
    float4 Color    : COLOR0;
    float  Rotation : COLOR1;
};

Posts: 1

Participants: 1

Read full topic

Monogame slow inside WPF

$
0
0

@bbbb0x wrote:

Hey,

I'm trying to render via Monogame inside multiple WPF controls (as preview what it's going to look like) and I have serve performance issues. I am rendering to renderTargets and then transforming them into bitmaps. The issue is this process takes way too long for a frame (50 ms) and freezes the window. Even when outsourcing it to a different thread, the rendering would be too slow and my PC is quite powerful, so I might be way worse on others. Here his how I transform the Monogame RenderTarget2D to a WriteableBitmap:

`

        Stopwatch sw0 = new Stopwatch();

        sw0.Start();

        renderTarget.GetData(buffer);
      
        // get the data from the render target


        sw0.Stop();
        Console.WriteLine("Get data duration: " + sw0.ElapsedMilliseconds + " ms");
       
        // because the only 32 bit pixel format for WPF is 
        // BGRA but XNA is all RGBA, we have to swap the R 
        // and B bytes for each pixel

        Stopwatch sw = new Stopwatch();
        sw.Start();
        for (int i = 0; i < buffer.Length - 2; i += 4)
        {
            byte r = buffer[i];
            buffer[i] = buffer[i + 2];
            buffer[i + 2] = r;
        }
        sw.Stop();
        Console.WriteLine("Pixel shift duration: " + sw.ElapsedMilliseconds + " ms");

        Stopwatch sw2 = new Stopwatch();
        sw2.Start();

        // write our pixels into the bitmap source
        writeableBitmap.Lock();
        Marshal.Copy(buffer, 0, writeableBitmap.BackBuffer, buffer.Length);
        writeableBitmap.AddDirtyRect(
            new Int32Rect(0, 0, renderTarget.Width, renderTarget.Height));
        writeableBitmap.Unlock();

        sw2.Stop();
        Console.WriteLine("To bitmap duration: " + sw2.ElapsedMilliseconds + " ms");`

I implemented some stopwatches to measure time. rendertarget.GetData costs the most time. The pixel shifting costs medium time too. Any way to fix this? As far as I read WPF controls have no HWND, so cannot render directly into them.

Posts: 2

Participants: 2

Read full topic

How to add a textbox

Anyone manage to use compute shader in monogame?


Copy sharpdx resource to monogame texture2d resource

$
0
0

@11110 wrote:

Is there anyway to Copy sharpdx resource to monogame texture2d resource without modify or recompile monogame library?

Posts: 1

Participants: 1

Read full topic

AnimatedSprite issues

$
0
0

@AnimaGames wrote:

Sorry if this is a dumb question but when I use an animated sprite and try to draw it with spriteBatch.Draw(animatedSprite); I get the error that it cannot convert an animated sprite to a texture2D which I get but this is how it says to set it up in the monogamy extended wiki

Any help??
Thanks so much!

Posts: 4

Participants: 2

Read full topic

NullReferenceException in GraphicsAdapter dll

Textures being drawn as if immediate on multiple spritebatch calls.

$
0
0

@thera wrote:

I'm basically trying to draw a bunch of stuff to a RenderTarget2D being outputting it to the screen.

Take the following code for example:

GraphicsDevice.Clear(Color.CornflowerBlue);

GraphicsDevice.SetRenderTarget(finalTarget);


spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, DepthStencilState.Default, null, null, null);

spriteBatch.Draw(character, position, null, Color.White, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0.5f);

spriteBatch.End();

spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, DepthStencilState.Default, null, null, null);

spriteBatch.Draw(Object1, new Vector2(100, 100), null, Color.Red, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0.9f);
spriteBatch.Draw(Object2, new Vector2(250, 250), null, Color.Green, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0.1f);

spriteBatch.End();

GraphicsDevice.SetRenderTarget(null);


spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, null);

spriteBatch.Draw(finalTarget, Vector2.Zero, Color.White);

spriteBatch.End();

(This example is very basic and just for my testing purposes)

From my understanding, I would expect this to draw the 3 textures to the render target in the order specified by the depth parameter on spriteBatch.Draw(). This works fine when I don't use a render target, but when I do, it acts as if its being drawn in immediate mode, so in this case Object1 and 2 are being drawn overtop character no matter what.

I'm sure its just something I'm not understanding, but any help would be appreciated!

EDIT

Disregard, I figured it out. Had to initialize the render target with some additional stuff in the constructor. See below:

finalTarget = new RenderTarget2D(GraphicsDevice, 800, 600, false, GraphicsDevice.PresentationParameters.BackBufferFormat, DepthFormat.Depth24Stencil8);

Posts: 1

Participants: 1

Read full topic

Moving old game from XNA to MonoGame

$
0
0

@3HMonkey wrote:

Hello guys, well, I am very new to the community and started with monogame some weeks ago.
Btw, by updating an old project from XNA to monogame there already came the first bug. I also need to say, that I am very new to shader programming, but I think I learn fast :slight_smile:

The project I am trying to update was already treated in another post but really someone did not think that thought quite to the end and considered the consequences or posted an answer. Maybe(I hope) you guys could help me.

Here are some infos about. in XNA it looks like this. Everything is colored right:

Here is the same thing after I merged the files in a new ganerated monogame project. As you can see on the picture, some items are rendered black instead of a color. I need to say, that everything without any color (hue:0) is rendered correctly. Everything what should be hued is rendered black. Furthermore gumps and fonts aren't rendered correctly.

Everything I needed to do was to change the vertex- and pixelshader from:
vs_2_0
to
vs_4_0_level_9_1
and
ps_2_0
to
ps_4_0_level_9_1

Here is the shader I am currently using:

Maybe you guys know, what I am doing wrong?

Thank you for your time!!!

Posts: 2

Participants: 2

Read full topic

Viewing all 6821 articles
Browse latest View live