Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Xerophyte
Mar 17, 2008

This space intentionally left blank

Woodsy Owl posted:

An iterator nested inside another iterator works well. However, this method is O(n^2) so performance blows if you have a bunch of objects to gravitate towards each other. Remember that the universal gravitational constant is really small so the force of gravity is really weak.

And yet, it always wins. Err, anyhow, this is probably overkill for the task at hand but if there are a couple of thousand particles when running an n-body simulation look into Barnes-Hut algorithm which reduces the asymptotic complexity to a more manageable O(n log n). It basically involves generating an octree at every step of the simulation, which isn't terribly difficult as datastructures go but is certainly more work than brute force.

Adbot
ADBOT LOVES YOU

Yodzilla
Apr 29, 2005

Now who looks even dumber?

Beef Witch
I gamejammed and Crabmando happened. Hooray for Futile!

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

Yodzilla posted:

I gamejammed and Crabmando happened. Hooray for Futile!
That's more fun than a lot of Kongregate games.
Is the king crab beatable? I shot it in the eyeball for quite a while to no avail.

Yodzilla
Apr 29, 2005

Now who looks even dumber?

Beef Witch
Oh yeah definitely. Make sure to grab all the powerups and he goes down after a few seconds. Aim at the ground if you're having trouble with zits.

DancingPenguin
Nov 27, 2012

I ish kakadu.

Yodzilla posted:

I gamejammed and Crabmando happened. Hooray for Futile!



This really rules.
Great job.
:dukedog:

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

Yodzilla posted:

Oh yeah definitely. Make sure to grab all the powerups and he goes down after a few seconds. Aim at the ground if you're having trouble with zits.
Ah, I was jumping all the zits, I was only shooting the moving things on the ground. That certainly helps to know they can be shot. Also I was tapping to fire, didn't realize holding the button would just fire constantly, that certainly helps too!

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
For any OpenGL experts:

I have a situation where I need to create N off-screen textures that are built every frame. Let's call them T1-T6, in the case that there's 6 of them. They are built progressively; some sprites are rendered to a buffer, and then saved to T1. Then, more sprites are added to that same scene (i.e. T1 should be saved off, but the buffer should not be cleared) and rendered to T2. Thus, T2 is T1 + more sprites.

Am I right to assume that this can be accomplished with a single framebuffer and N textures?

seiken
Feb 7, 2005

hah ha ha

Orzo posted:

For any OpenGL experts:

I have a situation where I need to create N off-screen textures that are built every frame. Let's call them T1-T6, in the case that there's 6 of them. They are built progressively; some sprites are rendered to a buffer, and then saved to T1. Then, more sprites are added to that same scene (i.e. T1 should be saved off, but the buffer should not be cleared) and rendered to T2. Thus, T2 is T1 + more sprites.

Am I right to assume that this can be accomplished with a single framebuffer and N textures?

I'm not sure I understand what you're actually asking, so I'll answer two questions.

I believe it's possible to switch which texture a framebuffer is associated with, but I don't think there's any point. Framebuffers themselves are cheap compared to the textures they are associated with, so you may as well allocate as many framebuffers as you have textures you want to render to. Implementation-dependent, but I suspect it's unlikely that switching out the texture of the framebuffer you're rendering to is any better than just switching the framebuffer you're rendering to.

If you were rather asking about the order of operations, you're going to need to either render each layer multiple times (render layer 1 to T1, T2, ... T6; layer 2 to T2, ... T6; etc) or make N - 1 copies (copy T1 to T2 before rendering more, T2 to T3 and so on). There isn't a way to create these N textures without copying or duplicated rendering. (Although, depending on what you intend to eventually do with them, there may be a way to avoid having to create them at all.)

seiken fucked around with this message at 19:49 on Jun 17, 2013

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
Okay, in that case I think it'll be easier to just render certain sprites multiple times instead of doing a progressive copy, thanks.

As for what this is for: I've successfully implemented layer-over-layer functionality (not just drawing layers, but entire 'sets' of layer, which I call 'slabs'--i.e. climbing up a ladder or jumping off a cliff takes you to a new 'slab') for my game. Everything works as expected except for the lights.

For reference: See: https://twitter.com/ericswheeler/status/346475612761882624/photo/1

I have two slabs in this picture, lower and upper, both with a light source. The lights on the lower slab should NOT illuminate the upper slab (imagine the player walking around with a flashlight--it would look silly to light up an overpass he's walking under), but lights on the upper slab should light up the lower slab.

Rendering slabs from the bottom up works fine except that the bottom slab isn't receiving light from the lights on the top slab. You can sort of see it in the picture.

So my solution for this example would be to have two 'lights' textures, one which is UPPER only (the upper slab would sample from this) and one that was LOWER + UPPER (the lower slab would sample from this).

Although...I don't know anymore. I'm looking at the screenshot and thinking that the upper light NOT shining down to the bottom actually creates a nice contrast. And a much simpler implementation, for when I need something to light up both slabs, would be to just render the same light multiple times on those slabs.

So, yeah, maybe I've solved my own problem?

seiken
Feb 7, 2005

hah ha ha
It might be nice if the upper light lit the bottom slab, but only a small amount (like reduce the light from the top to the bottom by 50% or some number).

FYI, it depends on how you're rendering the rest of your scene, but it's certainly possible to do this without needing to save all intermediate textures in some cases. For example (assuming N is the topmost slab):

  • Render slab N lights to light texture
  • Render slab N using light texture
  • (optional, for example) Render 50% opacity black across the light texture, to decrease light hitting slabs below
  • Render slab N - 1 lights to light texture
  • Render slab N - 1 using light texture
  • And so on

This relies on you being able to use the depth buffer and not needing to render back-to-front, which won't work if your slabs can be transparent, for example.

seiken fucked around with this message at 20:50 on Jun 17, 2013

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
Yeah, you called it. I definitely need to render back-to-front due to transparency. Otherwise, I'd be using the depth buffer as you suggested and rendering everything top-down.

I still think duplicating the lights is a fine solution for when it's actually needed, the code is so much simpler that way. Plus, we're only talking about a few lights per slab, and they're just sprites (not fancy real lights with shadows and whatnot), so it's not at all expensive.

Thanks!

Xerophyte
Mar 17, 2008

This space intentionally left blank

seiken posted:

If you were rather asking about the order of operations, you're going to need to either render each layer multiple times (render layer 1 to T1, T2, ... T6; layer 2 to T2, ... T6; etc) or make N - 1 copies (copy T1 to T2 before rendering more, T2 to T3 and so on). There isn't a way to create these N textures without copying or duplicated rendering. (Although, depending on what you intend to eventually do with them, there may be a way to avoid having to create them at all.)

Assuming this is GL2.0+ and performance matters, it's possible to only render each layer once but bind each texture to a separate attachment and render the same data to all attachments at once. E.g. attach texture Ti to GL_COLOR_ATTACHMENTi in whatever layer draw calls it should be written to, do gl_FragData[6] = gl_FragData[5] = ... = gl_FragData[0] = SomeNeatColor; in the shader.

Given the problem description -- and I know you specifically opted out of this earlier -- you could do deferred shading instead which solves the problem. Render the material colors, layer info (height coordinate, effectively) and normals if you have them for the entire screen to screen sized textures. To generate the actual image you then iteratively add light contributions by drawing a quad over the lit area for each light source and adding that light's contribution by doing the usual light calculations, reading from the stored data. The specific light shader used would determine how the height data is to be interpreted, letting you specify per light source type if the light should shine on lower floors; or if it should shine but with falloff; or whatever. This is less work to do than it sounds, with the large caveat that transparent things will need to be added separately.

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
That actually does sound pretty clever. Too bad about that last sentence, though. Transparency ruins everything!

Edit: I'm home now and went ahead and implemented it as just rendering lights multiple times depending on what slab is being rendered. Worked like a charm.



Now I'm really curious to see the programming behind how other developers have implemented this feature. Namely, the Link to the Past implementation would be cool, since it was, what, 20 years ago?

Orzo fucked around with this message at 00:12 on Jun 18, 2013

ZorbaTHut
May 5, 2005

wake me when the world is saved

Orzo posted:

Now I'm really curious to see the programming behind how other developers have implemented this feature. Namely, the Link to the Past implementation would be cool, since it was, what, 20 years ago?

The Link to the Past implementation is, I'm willing to bet, quite simple:

* Get the artists to make some tiles that look like they're lit
* Get the designers to place them appropriately
* Use those amazing new transparent overlays provided by the Super Nintendo for dynamic light sources and just live with the fact that you can't occlude them

Brute-force-by-artist is the way a lot of clever effects in old games were done. Honestly, it's the way a lot of clever effects in modern games are done.

HappyHippo
Nov 19, 2003
Do you have an Air Miles Card?

the posted:

I'm thinking to get a more realistic collision between two spheres I could do a force to the normal of the collision.

Should I use Forcemode.force or Constantforce?

Also, this may be a difficult question, but do you know of a way I could program in actual physics, i.e. Newton's law of universal gravitation giving each sphere a gravitational acceleration towards the others? I'm not sure if there's a way to say "sense every other gameobject, calculate the distance between it, and accelerate towards it at this rate."

You might be interested in this toy thing I made. Also your links are to things on your PC.

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!

ZorbaTHut posted:

The Link to the Past implementation is, I'm willing to bet, quite simple:

* Get the artists to make some tiles that look like they're lit
* Get the designers to place them appropriately
* Use those amazing new transparent overlays provided by the Super Nintendo for dynamic light sources and just live with the fact that you can't occlude them

Brute-force-by-artist is the way a lot of clever effects in old games were done. Honestly, it's the way a lot of clever effects in modern games are done.
There's no way you could have derived this from my post, but I was actually talking about the logical aspect of layer-over-layer rather than the lighting (I don't know why I didn't mention that, considering I was talking about lighting the entire time). As far as I know, the 'lighting' in LTTP was pretty trivial and I'm guessing they never coupled layer-over-layer areas with areas that needed lighting (like places where your flashlight was on).

The lighting wasn't even the trickiest part--the game logic was slightly more complex. For example, I had to change my entire structure of dynamically creating entities such that when you create one, you have to specify what slab it's being created on--like, if you're the player and you throw a boomerang, I can't just spawn a boomerang in the 'current scene' because that's no longer specific enough.

ZorbaTHut
May 5, 2005

wake me when the world is saved

Orzo posted:

There's no way you could have derived this from my post, but I was actually talking about the logical aspect of layer-over-layer rather than the lighting (I don't know why I didn't mention that, considering I was talking about lighting the entire time). As far as I know, the 'lighting' in LTTP was pretty trivial and I'm guessing they never coupled layer-over-layer areas with areas that needed lighting (like places where your flashlight was on).

The lighting wasn't even the trickiest part--the game logic was slightly more complex. For example, I had to change my entire structure of dynamically creating entities such that when you create one, you have to specify what slab it's being created on--like, if you're the player and you throw a boomerang, I can't just spawn a boomerang in the 'current scene' because that's no longer specific enough.

I think I'd do roughly what it sounds like you're doing, then - divide the world into slabs, have hand-authored triggers to modify the player's slab ID. The complexity at that point comes down to artist and coder complexity, not a lot of CPU overhead, which is of course exactly what you want as an SNES coder.

Shalinor
Jun 10, 2002

Can I buy you a rootbeer?

ZorbaTHut posted:

Brute-force-by-artist is the way a lot of clever effects in old games were done. Honestly, it's the way a lot of clever effects in modern games are done.
This was basically how we did LEGO Universe, end to end. I made a system that let artists drive visibility in a clever way, and then they went crazy and brute forced some amazing maps.

That doesn't mean that brute force by artist is a good idea, especially if you're a small developer, but... it can definitely work.

Paniolo
Oct 9, 2007

Heads will roll.
The SNES's video memory is naturally organized into layers. The lighting effects in LotP and most other SNES games involve a masking layer in combination with palette swapping. If you have an emulator you can toggle rendering each layer on and off to see exactly what's going on.

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
Kind of an odd question, but does anyone have a link to something like a package of OpenGL rendering examples? I don't need any code--I'm having a stuttering problem and I'm trying to figure out if it's something with my machine/drivers or my code. I just want something that has a bunch of OpenGL rendering samples that I can run. I get some stuttering (even with vsync on) on both my main PC and my laptop ever since converting to OpenGL, but someone else gets no stuttering at all when they tried it.

ZombieApostate
Mar 13, 2011
Sorry, I didn't read your post.

I'm too busy replying to what I wish you said

:allears:
Are you running in debug? I get the same deal with my own project sometimes, but it goes away if I run in release.

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
No, I've tried both debug and release builds. No luck. Anyway, I suspect it may be my machine, which is why I want a test suite.

AntiPseudonym
Apr 1, 2007
I EAT BABIES

:dukedog:

Orzo posted:

No, I've tried both debug and release builds. No luck. Anyway, I suspect it may be my machine, which is why I want a test suite.

Is that running the release build with the debugger attached or just running the .exe? I've had issues in the past with the debugger causing some really annoying stutters due to the debug heap. If it runs fine without the debugger, add _NO_DEBUG_HEAP=1 to your environment and it should fix it (Although note that it will mean that you may not be notified of heap corruption if/when it occurs).

Orzo
Sep 3, 2004

IT! IT is confusing! Say your goddamn pronouns!
Just running the exe. Release build, no debugger attached

Lord Windy
Mar 26, 2010
I've taken a long break from my project and I've come back to it. I've been porting it over to Unity from Java and I've run into a speed issue with Unity.

My game saves almost everything to text files, this was no issue in Java. Despite writing several million lines of information to text files, I managed to get it done in several seconds, and could read in a similar amount of time. All very easy. Now in unity, when I use System.IO, it takes about 10 minutes to do the same code equivalent. It's a little disappointing, since I can generate random maps and all the code side of things faster than in Java.

This is my code when it comes to saving

code:
Public WorldGeneration
//ignore everything
for (int y = 0; y < RegionsHeight; y++)
{
	for (int x = 0; x < RegionsLength; x++)
	{
		string send = RegionSaves + "/RegionY" + y + "X" + x + ".txt";

		using (StreamWriter sw = File.CreateText(send))
		{
			sw.WriteLine("[REGION:" + y + ":" + x +"]");
			sw.Close();
		}
		Regions[y,x].Save(send);
	}
}
code:
public Region
//Other useless stuff
public void Save(string FilePath)
{
	for (int Y = 0; Y < Length; Y++)
	{
		for (int X = 0; X < Length; X++)
		{
			using (StreamWriter sw = System.IO.File.AppendText(FilePath))
			{
				sw.WriteLine("[TILE:"+Y+":"+X+"]");
				sw.Close();
			}
			this.Tiles[Y,X].Save(FilePath);
		}
	}
}
code:
public Tile
//useless stuff
public void Save(string Filepath)
{
	using (StreamWriter sw = System.IO.File.AppendText(Filepath))
	{
		sw.WriteLine("[TERRAIN:"+this.TilePath+"]");
		sw.WriteLine("[COLOUR:"+this.Colour+"]");
		sw.Close();
	}
}
I did something very similar in Java. Just instead of the 'using' line, I just used the BufferedWriter class from Java.IO. The Tile Class didn't write anything either, it just sent back strings to the Region class that did write. I changed it this time as it reduced lines of code.

code:
outputSteam = new BufferedWriter(new FileWriter(fileP,true));
outputSteam.write("[OBJECT:REGION]");
outputSteam.newLine();
outputSteam.close();
I tried looking through the Unity forums, and I haven't yet created a 'prototype' where I just save data to make sure System.IO is the problem. If anyone knows the reason why it is so slow that would be amazing. If it ends up being a problem with Unity in general I might have to switch back to Java as there is a heap of stuff I need to save in this game.

EDIT:

And just like that, I think I found something on the Microsoft help site. Apparently .Net has bufferedStream as well, which might fix all my problems. Java documentation went to great lengths to point out that BufferedWriter was MUCH faster than StreamWriter in Java. I didn't even know .Net had one until I went to an entirely different section of the website.

Lord Windy fucked around with this message at 06:29 on Jun 19, 2013

Paniolo
Oct 9, 2007

Heads will roll.
You are literally reopening and closing the file twice for every single tile in your entire game. I'm guessing your equivalent Java code wasn't doing that. Open the file and close the file outside of your loop and it will be like loving magic.

Suspicious Dish
Sep 24, 2011

2020 is the year of linux on the desktop, bro
Fun Shoe
I had no idea foo[X,Y] was a thing in C#.

Lord Windy
Mar 26, 2010

Paniolo posted:

You are literally reopening and closing the file twice for every single tile in your entire game. I'm guessing your equivalent Java code wasn't doing that. Open the file and close the file outside of your loop and it will be like loving magic.

You are a wonderful person. It went at pretty much the same speed, if not faster than the Java code. I can't believe I was that blind. You were right though, it only opened it for every Region as this one is now.

Suspicious Dish posted:

I had no idea foo[X,Y] was a thing in C#.

And it confuses the hell out of me. I really wish they kept it [][], even if whatever they replaced [][] with is really useful.

Coldrice
Jan 20, 2006


Quick Unity/Futile question

I'm noticing strange distortion/warbling on some of my textures. I'm using texturepacker to put it together, and everything else that uses texture packer in the game works fine. Just the UI elements. The actual UI image itself that texturepacker output is fine. Is there something going on within unity causing this?

screenshot:

Bongo Bill
Jan 17, 2012

Lord Windy posted:

And it confuses the hell out of me. I really wish they kept it [][], even if whatever they replaced [][] with is really useful.

[][] still exists. Use [][] for nested containers (whose children cannot necessarily be assumed to have the same length) and [,] for multi-dimensional containers (where you often do wish it to be understood that the entire range is valid across the entire domain and vice versa).

The Insect Court
Nov 22, 2012

by FactsAreUseless
So are there any worthwhile alternatives to Unity/Futile for mobile cross-platform development? Or, alternatively, some Javascript/Python(or whatever the weird Unity equivalents are) bindings for it? I'd rather not have to pick up C#. There are a zillion Javascript/Haxe/Lua frameworks but they either require licensing fees, have questionable mobile support, and/or lack basic features.

The Gripper
Sep 14, 2004
i am winner

The Insect Court posted:

So are there any worthwhile alternatives to Unity/Futile for mobile cross-platform development? Or, alternatively, some Javascript/Python(or whatever the weird Unity equivalents are) bindings for it? I'd rather not have to pick up C#. There are a zillion Javascript/Haxe/Lua frameworks but they either require licensing fees, have questionable mobile support, and/or lack basic features.
A goon linked to Loom a while back (I think he's a developer with it/the main developer I can't remember!) but it's pretty much an AS3-style framework that deploys to everything, though it's $39 or something for an indie license now.

I've used it and it works really well, plus they're pretty good with support.

superh
Oct 10, 2007

Touching every treasure

Coldrice posted:

Quick Unity/Futile question

I'm noticing strange distortion/warbling on some of my textures. I'm using texturepacker to put it together, and everything else that uses texture packer in the game works fine. Just the UI elements. The actual UI image itself that texturepacker output is fine. Is there something going on within unity causing this?

screenshot:



That looks super weird, other than some weird texture creation issue the only thing I can think of is to make sure the position of those elements is a whole number, maybe it's freaking out trying t sub-pixel render those sprites?

Yodzilla
Apr 29, 2005

Now who looks even dumber?

Beef Witch
Do you have Allow Rotation enabled in TexturePacker? That sometimes causes weird things to happen and the newest version of Futile even throws an error saying it's no longer supported because of it.

The Insect Court
Nov 22, 2012

by FactsAreUseless

The Gripper posted:

A goon linked to Loom a while back (I think he's a developer with it/the main developer I can't remember!) but it's pretty much an AS3-style framework that deploys to everything, though it's $39 or something for an indie license now.

I've used it and it works really well, plus they're pretty good with support.

What about actual AS3/Flash-based frameworks? I'd ditch HTML5 support if it meant a better framework for mobile stuff, and a lot of the haxe/JS options seem to be imitations of earlier Flash-based engines. Citrus and Sparrow(which the former builds on) look pretty impressive. Any advice in general about using Flash for mobile game development?

Harvey Mantaco
Mar 6, 2007

Someone please help me find my keys =(
A question about referencing files.

I'm using Cocos2d-X (Primarily working in XCode C++ and compiling in Eclipse for Android devices as well) and I've set up different groups of images to use on different resolutions.

iOS and code works fine (you just go push_back("target file name") and it knows to look in the resources folder under your project), but I'm not used to eclipse and I'm doing something wrong here.

code:

    if (platform == kTargetAndroid){
            //Android phones and tablets >= 1920 by 1080 [16:9 aspect ratio, target ratio]
            if (screenSize.height >= 1920)
            {
                resourceSize = CCSizeMake(1920, 1080);
                searchPaths.push_back("Resources/resources_andhd");
                cocos2d::CCLog("-->Loading and HD graphics");
            }
            //Remaining Android phones and tablets (default 1280 by 720)
            else if (screenSize.height >= 1280 && screenSize.height < 1920)
            {
                resourceSize = CCSizeMake(1280, 720);
                searchPaths.push_back("Resources/resources_andsd");
                cocos2d::CCLog("-->Loading and SD graphics");
            }
            //In the odd case we are supporting an old phone so just shrink smallest existing
            else
            {
                resourceSize = CCSizeMake(960, 640);
                designSize = CCSizeMake(960, 640);
                searchPaths.push_back("/Resources/resources_iphonehd");
                cocos2d::CCLog("-->Loading placeholder iPhone HD graphics for and device");
            }
    }
    else if (platform == kTargetIphone)
    {
	//blah
It's getting to the push_back code properly but I'm getting the error:
code:
06-20 04:56:29.129: D/cocos2d-x debug info(4606): Get data from file(ui_Background.png) failed!
06-20 04:56:29.140: A/libc(4606): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 4619 (Thread-159)
In my project I have the images saved under a Resource folder so my project looks like
code:
->ProjectName
  ->Src
  ->Bin
  ->etc...
  ->Resources
    ->resources_andhd
      ->ui_Background.png
      ->blahblah.png
    ->resources_andsd
      ->ui_Background.png
      ->blahblah.png
I'm tried referencing those situational resource files using Resource/resources_xxxxx, /Resource/resources_xxxxx, resources_xxxxx... I'm tried putting them into the assets folder and referencing them that way. I've tried referencing them using the absolute path from root. It's something that should be so simple but I'm stuck on it.

Coldrice
Jan 20, 2006


just to add more to my Unity/Texturepacker warbling issues, adding a few more sprites to the atlas seems to have fixed ONE of the UI elements for some reason. I tried everything to fix it and I just can't figure it out!

Yodzilla
Apr 29, 2005

Now who looks even dumber?

Beef Witch
Could you post a screenshot of your TexturePacker publishing settings?

SuicideSnowman
Jul 26, 2003
I don't know much about Futile but it could be an issue of other textures in your atlas bleeding. Most graphic APIs have a way of changing the wrap mode to "clamp" to eliminate this problem.

Adbot
ADBOT LOVES YOU

Yodzilla
Apr 29, 2005

Now who looks even dumber?

Beef Witch
Yeah Coldrice, if you could I'd like to see both your TexturePacker settings and your atlas image settings in the Unity Inspector.



And now for a question of my own! Is there any way for me to see any or all colliders in the game or scene view? I want to start learning physics in Unity now that Futile as support for it but not being able to see colliders is confusing as hell.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply