Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (528)
Games in Android Showcase (127)
games submitted by our members
Games in WIP (594)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1] 2 3
  ignore  |  Print  
  [odejava] Weird GeomTriMesh problems  (Read 10421 times)
0 Members and 1 Guest are viewing this topic.
Offline Mithrandir

Senior Devvie




Cut from being on the bleeding edge too long


« Posted 2004-10-22 18:36:52 »

I'm having some issues with GeomTriMesh detecting a collision. The summary is that any part of the tri mesh that has a negative Z component will not generate contacts!  Huh Angry  We're completely stumped by this and just can't seem to find out what is going wrong. If we translate everything to positive Z, then it works fine, but leave it centerd about the origin and everything goes down the crapper.

The docs are a little hazy, and the examples don't help at all. From what I can tell, the trimesh is running a left-handed coordinate system, with +Z upwards. However, I have tried feeding the geometry with both Y&Z reversed, opposite order triangle winding and almost every combo you can think of, and it's still not finding them Sad  This is getting frustrating, and my brain is quite fried (project deadline tomorrow) so any assistance on places to look at where I might be doing stuff wrong would be greatly appreciated.

The site for 3D Graphics information http://www.j3d.org/
Aviatrix3D JOGL Scenegraph http://aviatrix3d.j3d.org/
Programming is essentially a markup language surrounding mathematical formulae and thus, should not be patentable.
Offline William Denniss

JGO Coder


Projects: 2


Fire at will


« Reply #1 - Posted 2004-10-22 23:15:04 »

If it's any help, I can confirm the presence this bug at negative Z values and at large positive Z values.

I also noticed some strange happenings in my game where the tri-mesh would fail at certain points.  Thanks to your post I now know this is when the map goes into the negative and can work around the problem.  Thank you, I'm very glad this bug has been discovered!  As it only happened rarely in my project, I was hoping it would just go away Wink

As to why it happens or how to fix it I don't know.  The winding of the triangles is important as you mentioned - but if it only fails for negative Z (which mine also does) then it's certainly an ODE/Odejava problem.

Perhaps this is worth a post to the ODE mailing list asking if anyone else has the problem.  It has been a while since I updated the ODE binaries, perhaps this is resolved with the latest version of ODE.

Will.

Offline Mithrandir

Senior Devvie




Cut from being on the bleeding edge too long


« Reply #2 - Posted 2004-10-23 12:43:37 »

Bugger Sad  Ok. Well we had to bail on doing the trimesh anyway and now have our modellers going OT on building an abstracted model using boxes. Probably end up running faster that way anyway....

The site for 3D Graphics information http://www.j3d.org/
Aviatrix3D JOGL Scenegraph http://aviatrix3d.j3d.org/
Programming is essentially a markup language surrounding mathematical formulae and thus, should not be patentable.
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #3 - Posted 2004-11-21 11:18:29 »

Me too Smiley Any news on this issue?

EDIT: Ah, however, only collisions with a negative Z component work for me Smiley

Kev

Offline William Denniss

JGO Coder


Projects: 2


Fire at will


« Reply #4 - Posted 2004-11-22 06:20:54 »

Kev,

It's odd that your results are opposite - maybe your winding or gravity is reversed?

I can confirm this is still a live bug.  Not sure if it's ODE or us -- or even if it is a bug at all (it could be a feature...).

Will.

Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #5 - Posted 2004-11-22 06:43:32 »

Its probably the winding, I've not payed much attention there. I was hoping to produce a relatively generic engine but with this bug its going to be hard Smiley

So.. so fun tho, ODE really is entertaining.

Kev

Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #6 - Posted 2004-11-22 11:48:58 »

im really stumped by this  Huh cause I dont see this bug anywhere!

See this demo:

http://www.myjavaserver.com/~digiwired/physics-terrain.jnlp

The terrain is centered at (0,0,0) and all the collision is fine! Whats going on!

DP

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline Mithrandir

Senior Devvie




Cut from being on the bleeding edge too long


« Reply #7 - Posted 2004-11-22 12:06:29 »

I still feel it's an ODE bug rather than winding. I tried reversing the winding of our triangles going into the mesh and it made no diffference. The test we have is a simple flat triangulated mesh with a bouncing ball. As soon as the ball gets past a triangle that is completely in the negative Z axis, contact information is no longer generated.  Huh

The site for 3D Graphics information http://www.j3d.org/
Aviatrix3D JOGL Scenegraph http://aviatrix3d.j3d.org/
Programming is essentially a markup language surrounding mathematical formulae and thus, should not be patentable.
Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #8 - Posted 2004-11-22 12:12:53 »

i haven't looked very carefully at the ODE native code. But it looks like they might be doing (z*z) or modulus(z) somewhere on the Z component to calculate some physics equation...and if the position is in the Z ignore it...

Thats the only solution I can think of...But whats really troubling me, is if that was the answer, then why am I not getting that bug!  :-/

DP

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #9 - Posted 2004-11-22 12:17:49 »

DP, is your "floor" represented by a GeomTriMesh or a GeomBox?

Kev

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #10 - Posted 2004-11-22 13:49:09 »

In the towers you mean? its a box.

But the terrain is a trimesh...

DP

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #11 - Posted 2004-11-25 18:17:17 »

Just had a look at your physics system in the vain hope I might be able to work out whats going on with this. Its very nice.

Your terrain is origined as 0,0,0 tho, so I guess is goes out along the x and z axis in one direction only? You wouldn't see the problem this way I don't think...

I might have a play in a bit if I get time..

Kev

Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #12 - Posted 2004-11-25 19:08:20 »

Quote

Your terrain is origined as 0,0,0 tho, so I guess is goes out along the x and z axis in one direction only


Yes, you are correct, it only extends in the +z and +x. However, i have just translated everything into the -z section, and played around with different combinations of + and -ves. And all in all, the collision is fine!

Try moving the terrain -200 z and the balls -200 z. They still collide.

DP

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #13 - Posted 2004-11-26 05:09:45 »

I'm not trying to get at you here.. I'd just really like to know whats different between what you're doing and what other folk are doing.. I've tried to go through with a fine tooth comb but not managed to turn up anything yet.. even down to ordering of operations...

For my purposes this issue and the non-moving trimesh issue makes ODE pretty much un-usable.

Kev

Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #14 - Posted 2004-11-26 13:02:19 »

Quote

I'm not trying to get at you here


Ofcourse not. Sorry if my message implied that. I was pretty tired.

And to be honest, i would like to know what I am doing to make it work!  Smiley

DP

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #15 - Posted 2004-11-26 13:44:03 »

I think that triangle winding thing really was a bit of break through. I'm doing some nice primitive experiments and simply changing the order in which the vertices are specified effects the collision or not collision even when specifing normals it seems.

Mad!

Kev

Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #16 - Posted 2004-12-01 08:38:29 »

I'm still trying to resolve this issue. Has anyone had reports that ODE doesn't work very well on large triangles.. seems to be confused .. shrink um down and they work quite happily.

This would explain why the terrain demos I've seen would work.. lots of little triangles.

I'm going to write a utility to split triangles over a certain width/depth/height into multiple smaller triangles before passing it into ODE.

Kev

Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #17 - Posted 2004-12-01 10:59:39 »

Coo, sub-dividing all my triangles on an arbitary designed map seems to have done the trick. I've used Maplet to produce a B3D model, which is stuck through JME and then converted into a ODE mesh (via the sub-dividing routine) and it works quite happily.

My little alien is running all over the place interacting with the environment correctly. Excellent!

Kev

Offline William Denniss

JGO Coder


Projects: 2


Fire at will


« Reply #18 - Posted 2004-12-08 08:00:08 »

Do you have one large tri-mesh or several smaller ones making up the environment?

I believe having lots of smaller Tri-mesh making up a larger one might work better better with ode, but I havn't tried it yet.

Will.

Offline kevglass

« JGO Spiffy Duke »


Medals: 210
Projects: 24
Exp: 18 years


Coder, Trainee Pixel Artist, Game Reviewer


« Reply #19 - Posted 2004-12-08 09:07:44 »

I think you're correct (at least from trying it I do Wink). A series of small collections of triangles is better for ODE. However, the collisions not working seems to be to do with the size of the triangles rather than the size of the collection of triangle.

Infact it seem to be more to do with how far your primitive is away from the points of the triangle as to whether it would work or not.

Kev

Offline darkprophet

Senior Devvie




Go Go Gadget Arms


« Reply #20 - Posted 2004-12-26 22:02:32 »

Here is something that i found related to this...WITH A PATCH!

http://www.zenohm.com/ode.html#dTerrainZ

It also solves the -z coordinate problem too i believe (didn't read too much of it yet) Smiley

Friends don't let friends make MMORPGs.

Blog | Volatile-Engine
Offline ewills

Junior Devvie




Java skeletal animation systems rock!


« Reply #21 - Posted 2005-02-24 20:01:33 »

Two questions about terrain:

1.  kevglass:  what is your maximum tolerance for the size of your trimesh triangles.  My triangles are quite large (10m sides).  Subdividing them once seems to help, subdividing them twice seem to make the problem worse.  Also, is your height map restricted to +z or -z values?

2.  I see that odejava has a GeomTerrain class that doesn't seem to do anything.  Would it be possible to support the dTerrainY and dTerrainZ patches for ode?  I think that would help many of our terrain problems.
Offline William Denniss

JGO Coder


Projects: 2


Fire at will


« Reply #22 - Posted 2005-03-02 06:29:25 »

what is the status of those patches?

If we can integrate them into our automatic build system then yes, they can go in.  I'm not accepting anything in unless the patching agains the ODE CVS is automated, it is time consuming generating a new odejava build with uptodate sources, and I don't want to make it more so.

The last time I looked at ODE terrain support, it was terrible.  Just a patch that someone had done, with no documentation and no source code comments!

But, I agree, this would be most handy if it is supported.

Will.

Offline ewills

Junior Devvie




Java skeletal animation systems rock!


« Reply #23 - Posted 2005-03-02 14:32:53 »

Nope, no documentation or source code comments Smiley

It requres modification of the ODE source:
http://cvs.sourceforge.net/viewcvs.py/opende/ode/contrib/TerrainAndCone/readme.txt?view=markup

Has anyone gotten a TriMesh to work well as a terrain?  I'm having all kinds of problems.  Any pointers?
Offline William Denniss

JGO Coder


Projects: 2


Fire at will


« Reply #24 - Posted 2005-03-02 22:06:10 »

I've got it working, the tri-mesh is created from a randomly generated height map.  One of the Odejava demos has it working with an ASE model.

What's happening with your attempts?

Will.

Offline ewills

Junior Devvie




Java skeletal animation systems rock!


« Reply #25 - Posted 2005-03-03 00:17:04 »

The main problem is objects passing through the trimesh.  This is understandable for high-velocity objects, but objects with no vertical velocity will pass through in certain places.  I am using fairly big triangles (10m sides), so this might be the issue.  How big are your triangles?  Is there a way to add "padding" to the trimesh?  Also, where is this Odejava demo?  
Offline Ole Friis

Senior Newbie




Java rocks! Games are fun!


« Reply #26 - Posted 2005-03-03 17:48:17 »

Hi!

Just a quick note: I have exactly the same problem - my car in my game passes through some of my trimeshes, and stay on top of others. I've no idea what makes it pass through some trimeshes and not others, as the trimeshes are very alike, they are only turned a little compared to each other (i.e. the lengths of the sides of the trimeshes are identical).

I could strip down my "wannabe-game" to a simple example showing the problem, if that could be of any use. (If somebody already has a simple example program showing the problem, I won't spend my time on that, but otherwise I'll do it in the weekend!) I don't know where to upload my source files in that case, though, as I don't have a home page of my own :-)

Ole
Offline Ole Friis

Senior Newbie




Java rocks! Games are fun!


« Reply #27 - Posted 2005-03-05 11:32:44 »

So, nobody interested? :-) Anyway, I've done my work and made a little demonstration of my problems. Unfortunately, I cannot post it to this forum, since it would make my post too long (I already tried, yes ;-) ). If anybody has an idea about where I can put my code, please send a note.

(The rest of this posting assumes you have my code...)
Take the code and compile it. I've put it all in one class, for your convenience. Run it, and feel puzzled :-)

I guess this demo clearly shows that Ode or Odejava has problems with Trimesh collisions, unless I made a basic bummer somewhere in my code.

BTW, I'm using the latest Odejava files available at the Odejava homepage, and I'm running on Linux. If anybody running other versions or using other OS'es don't see a problem when running my demo, please let me know ;-)

Enjoy!

Ole
Offline Ole Friis

Senior Newbie




Java rocks! Games are fun!


« Reply #28 - Posted 2005-03-05 18:09:06 »

package collisionproblem;

import javax.vecmath.*;

import org.odejava.*;
import org.odejava.collision.JavaCollision;
import org.odejava.display.DisplayBin;
import org.odejava.xith3d.OdejavaToXith3D;
import org.odejava.xith3d.Xith3DDisplayObject;

import com.xith3d.render.CanvasPeer;
import com.xith3d.render.RenderPeer;
import com.xith3d.render.jogl.RenderPeerImpl;
import com.xith3d.scenegraph.*;
import com.xith3d.scenegraph.Locale;

public class CollisionProblem {
   // Number of pieces in the ramp
   private int rampPieces = 8;

   // Radius of the middle of the ramp
   private double circleRadius = 20;

   // Width of the ramp
   private double rampWidth = 20;

   // View
   Vector3f viewLocation = new Vector3f(-40f, -40f, 70f);
   Vector3f viewCenter = new Vector3f(0f, 0f, 0f);

   // Variables that are used as in the Odejava-Xith3d examples
   View view;
   Locale locale;
   BranchGroup scene;
   OdejavaToXith3D odejavaToXith;
   DisplayBin boundObjects = new DisplayBin();
   HashSpace space;
   JavaCollision collision;
   World world;

   private static int rampPartNumber;

   public static void main(String[] args) throws Exception {
       CollisionProblem problem = new CollisionProblem();
       problem.render();
   }

   public CollisionProblem() {
       initXith();
       initExample();
       initLights();
       initXithFromOdejava();
   }

   private void initXith() {
       VirtualUniverse universe = new VirtualUniverse();
       view = new View();
       universe.addView(view);
       locale = new Locale();
       universe.addLocale(locale);
       scene = new BranchGroup();
       locale.addBranchGraph(scene);

       // create canvas for our graphics
       RenderPeer rp = new RenderPeerImpl();
       CanvasPeer cp = rp.makeCanvas(null, 1024, 768, 32, false);
       Canvas3D canvas = new Canvas3D();
       canvas.set3DPeer(cp);

       // Set view
       view.addCanvas3D(canvas);
       view.getTransform().lookAt(viewLocation, viewCenter,
               new Vector3f(0, 0, 1));
   }

   private void initExample() {
       Odejava.getInstance();
       world = new World();
       world.setGravity(0f, 0f, -9.82f);
       space = new HashSpace();
       collision = new JavaCollision(world);
       createRamps();
   }

   private void initXithFromOdejava() {
       odejavaToXith = new OdejavaToXith3D(boundObjects);
       Appearance[] apps = new Appearance[] { createAppearance(1f, 0f, 0f),
               createAppearance(0f, 1f, 0f) };
       for (int i = 0; i < 200; i++) {
           odejavaToXith.addUserAppearance("RampPart" + i, apps[i%2]);
       }
       odejavaToXith.createTransformGroups(space.getGeoms());
       Xith3DDisplayObject.addToScene(boundObjects, scene);
   }

   private Appearance createAppearance(float r, float g, float b) {
       Appearance app = new Appearance();
       ColoringAttributes coloring1 = new ColoringAttributes();
       coloring1.setColor(r, g, b);
       app.setColoringAttributes(coloring1);
       return app;
   }

   private void render() {
       while (true) {
           // Collide objects in given space
           collision.collide(space);
           collision.applyContacts();

           // Step simulation
           world.quickStep(.01f);
           boundObjects.updateAll();
           view.renderOnce();

           // Make sure our CPU's don't need to go in 100% usage :-)
           try {
               Thread.sleep(10);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
   }

   private void initLights() {
       Color3f col1 = new Color3f(0.5f, 0.5f, 0.5f);
       Transform3D t = new Transform3D();
       Vector3f pos1 = new Vector3f(0.0f, 0.0f, 30.0f);
       t.set(pos1);
       Vector3f dir1 = new Vector3f(pos1);
       dir1.negate();
       dir1.normalize();
       DirectionalLight light1 = new DirectionalLight(col1, dir1);
       scene.addChild(light1);
       light1.setEnable(true);
   }

   /**
    * Creates Geoms for all the ramp pieces in the world.
    */
   private void createRamps() {
       for (int i = 0; i < rampPieces; i++) {
           createRampGeom(i);
       }
   }

   /**
    * Creates Geom for a single ramp piece in the world.
    */
   private void createRampGeom(int i) {
       Point3f beforeLeft = getInnerPoint(i - 1);
       Point3f beforeRight = getOuterPoint(i - 1);
       Point3f afterLeft = getInnerPoint(i);
       Point3f afterRight = getOuterPoint(i);

       int vertexCount = 4;
       int indexCount = 2;

       float[] vertices = new float[vertexCount * 3];
       int[] indices = new int[indexCount * 3];

       int beforeLeftIndex = 0;
       int beforeRightIndex = 1;
       int afterLeftIndex = 2;
       int afterRightIndex = 3;

       fillVertex(vertices, beforeLeftIndex, beforeLeft);
       fillVertex(vertices, beforeRightIndex, beforeRight);
       fillVertex(vertices, afterLeftIndex, afterLeft);
       fillVertex(vertices, afterRightIndex, afterRight);

       fillIndex(indices, 0, beforeLeftIndex, afterRightIndex, afterLeftIndex);
       fillIndex(indices, 1, beforeRightIndex, afterRightIndex,
               beforeLeftIndex);

       String name = "RampPart" + rampPartNumber++;
       GeomTriMesh rampGeom = new GeomTriMesh(name, vertices, indices);
       space.addGeom(rampGeom);

       // Create a couple of spheres, to demonstrate the collision problems
       createSphere(beforeLeft, beforeRight, afterRight);
       createSphere(beforeLeft, beforeRight, afterLeft);
   }

   /**
    * Creates a sphere in the middle of the 3 given points
    */
   private void createSphere(Point3f p1, Point3f p2, Point3f p3) {
       GeomSphere sphere = new GeomSphere(1);
       Body b = new Body(null, world, sphere);
       b.setSphereMass(1, 1);
       b.adjustMass(80);
       b.setPosition((p1.x + p2.x + p3.x) / 3, (p1.y + p2.y + p3.y) / 3, 7);
       space.addBodyGeoms(b);
   }

   private Point3f getInnerPoint(int i) {
       return new Point3f(getInnerX(i), getInnerY(i), 3);
   }

   private Point3f getOuterPoint(int i) {
       return new Point3f(getOuterX(i), getOuterY(i), 3);
   }

   private float getInnerX(int i) {
       return (float) (Math.cos(getAngle(i)) * (circleRadius - (rampWidth / 2)));
   }

   private float getOuterX(int i) {
       return (float) (Math.cos(getAngle(i)) * (circleRadius + (rampWidth / 2)));
   }

   private float getInnerY(int i) {
       return (float) (Math.sin(getAngle(i)) * (circleRadius - (rampWidth / 2)));
   }

   private float getOuterY(int i) {
       return (float) (Math.sin(getAngle(i)) * (circleRadius + (rampWidth / 2)));
   }

   private double getAngle(int i) {
       return (double) i / (double) rampPieces * (double) 2 * Math.PI;
   }

   private void fillVertex(float[] vertices, int index, Point3f point) {
       vertices[index * 3 + 0] = point.x;
       vertices[index * 3 + 1] = point.y;
       vertices[index * 3 + 2] = point.z;
   }

   private void fillIndex(int[] indices, int index, int p1, int p2, int p3) {
       indices[3 * index + 0] = p1;
       indices[3 * index + 1] = p2;
       indices[3 * index + 2] = p3;
   }
}
Offline Ole Friis

Senior Newbie




Java rocks! Games are fun!


« Reply #29 - Posted 2005-03-05 18:15:53 »

Yuippey, I managed to squeeze the demo into a posting small enough for the forum system, hopefully without letting go of too much readability. Please try and compile the above class and just invoke the main method. On my system, the spheres interact with only 2 of the 8 trimeshes, and fall through the rest as if they weren't there.

It's pretty easy for you guys to try and alter various parameters in the system. I've tried everything I could think of (number of contact points per interaction, surface mode, surface bounce, time steps, etc. etc.), but nothing seems to help.

Anyway, now you have something to play with this weekend. Have fun :-)

Ole
Pages: [1] 2 3
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

PocketCrafter7 (14 views)
2014-11-28 16:25:35

PocketCrafter7 (10 views)
2014-11-28 16:25:09

PocketCrafter7 (11 views)
2014-11-28 16:24:29

toopeicgaming1999 (77 views)
2014-11-26 15:22:04

toopeicgaming1999 (67 views)
2014-11-26 15:20:36

toopeicgaming1999 (17 views)
2014-11-26 15:20:08

SHC (30 views)
2014-11-25 12:00:59

SHC (28 views)
2014-11-25 11:53:45

Norakomi (32 views)
2014-11-25 11:26:43

Gibbo3771 (28 views)
2014-11-24 19:59:16
Understanding relations between setOrigin, setScale and setPosition in libGdx
by mbabuskov
2014-10-09 22:35:00

Definite guide to supporting multiple device resolutions on Android (2014)
by mbabuskov
2014-10-02 22:36:02

List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!