Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (539)
Games in Android Showcase (132)
games submitted by our members
Games in WIP (603)
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
  ignore  |  Print  
  [HELP] Converting Grayscale (InfraRed) to Color with JOGL [HELP]  (Read 11284 times)
0 Members and 1 Guest are viewing this topic.
Offline bahamut

Senior Newbie





« Posted 2005-10-07 12:57:23 »

Hi there,

I need help to use false coloring for my infrared camera. The image is displayed in black and white: black for cold, and white for warm objects. I want to adjust this colortable so, that it can display the picture in white, yellow, red, purple and black. By doing this, a normal human being can see more details from the picture. I tried in Photoshop with the same picture. I did something like converting the grayscale image to a colored indexed picture. After that, I altered the colortable of it. And then "voila", I got a perfect converted false colored picture.
I know that it is absolutly possible to do the same with JOGL. Can someone please give me some advises or a example code to make this possible???

Here below some technical details:

the image from the server which I called it "rawImage", is stored in a byteBuffer type. This image is added to a RGBA texture. After that I paint it in a loop.
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #1 - Posted 2005-10-07 14:04:58 »

It looks like glTexImage using the GL_COLOR_INDEX format and glPixelMap should do what you want, but I've never used this myself.
Offline anarchotron

Junior Devvie




...precious bodily fluids.


« Reply #2 - Posted 2005-10-07 16:19:05 »

Well since you already have the ByteBuffer image you could just preprocess it to do your color conversion there.  You could come up with any conversion you like, but I would recommend HSV -> RGB where your Hue is directly from the grayscale, and S V are 1.0.

See:
http://en.wikipedia.org/wiki/HSV_color_space#Transformation_from_HSV_to_RGB

For the equation there, first convert your grayscale value G into a 0-360 range.  Since, in the above equations, your S and V are always 1.0, several of the terms really simplify out.

Then just spin through your ByteBuffer, convert the grayscales into a new RGBA bytebuffer and use that as your texture.

Your other option would be to do the work mentioned above in a pixel shader, which will almost certainly get you better performance if your GPU's pixel units are otherwise idle.

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

Senior Newbie





« Reply #3 - Posted 2005-10-09 14:37:24 »

[Reaction to "anarchotron "]
Thanks for the reply

Does the convertion from grayscale value G into a 0-360 range done by the CPU or the GPU??? My CPU is allready 100% busy, so if the convertion comes to CPU, then the FrameRate will critically drop back to 1-10 fps (theoretically). And that is very bad....  Undecided

By the way... do you got a sample code to convert this HSV to RGB?
Offline anarchotron

Junior Devvie




...precious bodily fluids.


« Reply #4 - Posted 2005-10-09 15:18:27 »

Let the GPU do everything. 

Your fragment program would look (something) like  this:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
uniform sampler2D grayscaleTexture;

vec3 convertHsvToRgb(float H, float S, float V)
{
  int Hi = (H / 60) % 6;  // this may need to use the float mod() like this, can't remember: mod((H / 60.0), 6.0);
  float f = H / 60.0 - Hi;
  float p = V * (1.0 - S);
  float q = V * (1.0 - (f * S));
  float t = V * (1.0 - ((1.0 - f) * S));
 
  if (Hi == 0)
    return vec3(V, t, p);
  if (Hi == 1)
   return vec3(q, V, p);

  etc...
}

void main()
{
  vec4 grayscale = texture2D(grayscaleTexture, gl_TexCoord[0].st);

  //-- since the incoming grayscale r == b == g, just use r as the intensity

  float G = grayscale.r;
  float H = G * 360.0;
  vec3 rgb = convertHsvToRgb(H, 1.0, 1.0);
 
  now just set the output color to your converted color

  gl_FragColor = vec4(rgb, 0.0);
}


I didn't compile or test this code, but the conversion is directly from that URL.

One thing to watch out for is how the H wraps back around.  H=0 is red, then up through orange, yellow, green, blue, magenta.  When H=360 you are back to red.  You probably want to map your range into [0..300] instead of [0..360] so your hottest colors are magenta, not red.  Just multiply your H by 5/6 before passing it into the conversion.

This will be a great use of your idle GPU, especially if your CPU is already busy.
Offline Orangy Tang

JGO Kernel


Medals: 56
Projects: 11


Monkey for a head


« Reply #5 - Posted 2005-10-09 17:09:50 »

Why the complex convertHsvToRgb() function? As your incomming greyscale is already in the range [0, 1], just use the intensity as the texture coord into a 1d texture with your colour/temperature gradient.

- No complex maths in the fragment shader (and certainly no nasty conditionals)
- Data driven, just switch the 1d texture for an entirely different colour mapping

Your fragment shader would be something like:

1  
2  
3  
4  
5  
6  
7  
8  
9  
uniform sampler2D greyscale;
uniform sampler1D colourMapping;

void main()
{
  float intensity = texture2D(greyscale, texCoords).r;
  vec3 temperatureColour = texture1D(colourMapping, intensity);
  gl_FragColor = temperatureColour;
}

 

[ TriangularPixels.com - Play Growth Spurt, Rescue Squad and Snowman Village ] [ Rebirth - game resource library ]
Offline bahamut

Senior Newbie





« Reply #6 - Posted 2005-10-10 09:16:54 »

For personal reasons, I don't use CG scripts. So about the code above, I am not able to use it. Or maybe, the same method could be done by OpenGL options. If there is a way to do that, please tell me how and maybe a sample code.

Offline Riven
« League of Dukes »

« JGO Overlord »


Medals: 840
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #7 - Posted 2005-10-10 09:23:49 »

That isn't CG, it's GLSL, which can be used in OpenGL.

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #8 - Posted 2005-10-10 13:27:27 »

BTW disregard the pixelmap thing. After some further investigation it turns out this is a pretty badly supported part of OpenGL. Apparently most implementations don't accelerate it or have buggy implementations...
Offline bahamut

Senior Newbie





« Reply #9 - Posted 2005-10-10 13:29:06 »

That isn't CG, it's GLSL, which can be used in OpenGL.

And how do I suppose to use this GLSL. I am very infamilier with these Computer Graphics things. Is GLSL not a script which you have to load it with a OpenGL-function via JOGL???
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #10 - Posted 2005-10-10 13:39:03 »

http://www.lighthouse3d.com/opengl/glsl/
Offline bahamut

Senior Newbie





« Reply #11 - Posted 2005-10-11 10:33:45 »

Sorry for this stupid question, but I just don't get it. How do I suppose to use GLSL with JOGL. I read the Lighthouse-stuff. But those are C code, which I tried to rewrite it in Java, but some function don't seems to work. For instance.... what is GLhandleARB anyway. JOGL  don't know this thing, etc.... need some help plz. All I need is an example of java to use this GLSL
Offline Riven
« League of Dukes »

« JGO Overlord »


Medals: 840
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #12 - Posted 2005-10-11 11:11:48 »

what is GLhandleARB anyway

Just an int in java.

GLSL is one of the advanced features of OpenGL. Try to master OpenGL first, otherwise you'll get stuck sooner or later..

There are plenty of tutorials about GLSL, and IIRC nehe has a lession about it too. Porting to Java is normally 1:1, the weird GL-primitives are normally ints. Otherwise just check the javadocs to see what primitives the methods return.

If you just want a quick solution, it might be better to hire somebody, as it seems to be a professional project, isn't it?

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #13 - Posted 2005-10-11 11:13:43 »

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
void setShaders() {
   v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
   f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);  
   
   vs = textFileRead("toon.vert");
   fs = textFileRead("toon.frag");
   
   const char * vv = vs;
   const char * ff = fs;
   
   glShaderSourceARB(v, 1, &vv,NULL);
   glShaderSourceARB(f, 1, &ff,NULL);
   
   free(vs);free(fs);
   
   glCompileShaderARB(v);
   glCompileShaderARB(f);

   p = glCreateProgramObjectARB();
     
   glAttachObjectARB(p,v);
   glAttachObjectARB(p,f);
   
   glLinkProgramARB(p);
   glUseProgramObjectARB(p);


translates to

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
public void setShaders(GL gl) {
   // Create the shader objects for the vertex and fragment shader
   int v = gl.glCreateShaderObjectARB(GL.GL_VERTEX_SHADER_ARB);
   int f = gl.glCreateShaderObjectARB(GL.GL_FRAGMENT_SHADER_ARB);  
   
   // Read the GLSL code from file
   String vs = textFileRead("toon.vert");
   String fs = textFileRead("toon.frag");

   // Pass the source to OpenGL  
   gl.glShaderSourceARB(v, 1, new String[] {vv}, null);
   gl.glShaderSourceARB(f, 1, new String[] {ff}, null);
   
   // Compile the two shaders
   gl.glCompileShaderARB(v);
   gl.glCompileShaderARB(f);

   // Create the program object
   int p = gl.glCreateProgramObjectARB();

   // Attach the two shaders to the program object      
   gl.glAttachObjectARB(p,v);
   gl.glAttachObjectARB(p,f);
   
   // Link the program
   gl.glLinkProgramARB(p);

   // And set it as the current program
   gl.glUseProgramObjectARB(p);
}

public String textFileRead(String aFileName) {
   // Read file to String
}


I haven't had the opportunity to play with shaders yet, so I'm not sure this works Smiley
I'm not sure how jogl handles the Strings, so you might have to pass the length to glShaderSourceARB for things to work properly.
Offline Riven
« League of Dukes »

« JGO Overlord »


Medals: 840
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #14 - Posted 2005-10-11 12:48:33 »

Ok ok, and the feedback-handler
(LWJGL code but easy to port to JOGL)

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
...
glCompileShaderARB(f);
checkLogInfo(f, "Fragment Shader compilation: ", true);

...
glCompileShaderARB(v);
checkLogInfo(v, "Vertex Shader compilation: ", true);

...
glValidateProgramARB(p);
checkLogInfo(program, "Shader Program validation: ", false);


1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
   private final void checkLogInfo(int obj, String tag, boolean throwException)
   {
      IntBuffer iVal = BufferUtils.createIntBuffer(1);
      glGetObjectParameterARB(obj, GL_OBJECT_INFO_LOG_LENGTH_ARB, iVal);

      int length = iVal.get();

      if (length <= 1)
      {
         return;
      }
     
      ByteBuffer infoLog = BufferUtils.createByteBuffer(length);

      iVal.flip();
      glGetInfoLogARB(obj, iVal, infoLog);

      Util.checkGLError();

      byte[] infoBytes = new byte[length];
      infoLog.get(infoBytes);
      String out = new String(infoBytes);

      String msg = tag + out.substring(0, out.length() - 1);

      if (throwException)
      {
         throw new ShaderException(msg);
      }

      System.out.println("GLSL Validation >> " + msg);
   }



   private final ByteBuffer toByteString(String str, boolean isNullTerminated)
   {
      int length = str.length();

      if (isNullTerminated)
         length++;

      ByteBuffer buff = BufferUtils.createByteBuffer(length);
      buff.put(str.getBytes());

      if (isNullTerminated)
         buff.put((byte) 0);

      buff.flip();

      return buff;
   }

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline bahamut

Senior Newbie





« Reply #15 - Posted 2005-10-11 13:02:15 »

Tanks all, I hope this works...

Ehh....I did this now...

    int v = gl.glCreateShaderObjectARB(GL.GL_VERTEX_SHADER_ARB);
    String[] vs = { loadFile("Shaders.vert") };
    gl.glShaderSourceARB(v, 1, vs, null);

Eclipse say that the method glCreateShaderObjectARB is amibiguous for the type GL. Where is it going wrong this time?
Offline Riven
« League of Dukes »

« JGO Overlord »


Medals: 840
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #16 - Posted 2005-10-11 13:34:20 »

Well that is just a standard Java exception when you a method is overloaded and the parameters you send to it can be interpretated in different ways.

Like:
Holder.setValue(8, null);

With:
class Holder
{
   public static void setValue(int x, List list) {}
   public static void setValue(int x, Map map) {}
}

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline bahamut

Senior Newbie





« Reply #17 - Posted 2005-10-11 13:40:55 »

ah, yes... offcourse. Got it, I fixed it.... Thanks...

But afther this, I still got the following exception

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
Exception in thread "AWT-EventQueue-0" net.java.games.jogl.GLException: Method "glCreateShaderObjectARB" not available
   at net.java.games.jogl.impl.windows.WindowsGLImpl.glCreateShaderObjectARB(WindowsGLImpl.java:5779)
   at src.SecondGLEventListener.setShaders(SecondGLEventListener.java:71)
   at src.SecondGLEventListener.display(SecondGLEventListener.java:49)
   at net.java.games.jogl.impl.GLDrawableHelper.display(GLDrawableHelper.java:74)
   at net.java.games.jogl.GLCanvas$DisplayAction.run(GLCanvas.java:249)
   at net.java.games.jogl.impl.GLContext.invokeGL(GLContext.java:294)
   at net.java.games.jogl.impl.windows.WindowsOnscreenGLContext.invokeGL(WindowsOnscreenGLContext.java:79)
   at net.java.games.jogl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:236)
   at net.java.games.jogl.GLCanvas.display(GLCanvas.java:77)
   at net.java.games.jogl.GLCanvas.paint(GLCanvas.java:86)
   at sun.awt.RepaintArea.paintComponent(Unknown Source)
   at sun.awt.RepaintArea.paint(Unknown Source)
   at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
   at java.awt.Component.dispatchEventImpl(Unknown Source)
   at java.awt.Component.dispatchEvent(Unknown Source)
   at java.awt.EventQueue.dispatchEvent(Unknown Source)
   at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
   at java.awt.EventDispatchThread.run(Unknown Source)


Method "glCreateShaderObjectARB" not available?HuhHuhHuh Wrong Version of JOGL or something like that? By the way... I don't use Vertex anyway... so I deleted those
Offline Riven
« League of Dukes »

« JGO Overlord »


Medals: 840
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #18 - Posted 2005-10-11 14:04:02 »

You driver or your card doesn't support shader programs, it seems.

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social
Offline bahamut

Senior Newbie





« Reply #19 - Posted 2005-10-11 14:08:11 »

You driver or your card doesn't support shader programs, it seems.

Funny, so there is nothing wrong with my JOGL then... anyway... what kind of videocard do I need? I got a NVidia GeForce FX5200. Would that be a problem???
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #20 - Posted 2005-10-11 14:18:11 »

Here's a list of cards that support GL_ARB_fragment_shader
http://www.delphi3d.net/hardware/extsupport.php?extension=GL_ARB_fragment_shader
The 5200 series is in there. IIRC glsl support was initially only available as a beta feature and you had to change some registry setting to enable it. The latest driver revision should support it though, so maybe you need to update your driver?
Offline bahamut

Senior Newbie





« Reply #21 - Posted 2005-10-11 14:59:10 »

Here's a list of cards that support GL_ARB_fragment_shader
http://www.delphi3d.net/hardware/extsupport.php?extension=GL_ARB_fragment_shader
The 5200 series is in there. IIRC glsl support was initially only available as a beta feature and you had to change some registry setting to enable it. The latest driver revision should support it though, so maybe you need to update your driver?

I think, I made a stupid mistake again. I did not even installed the driver yet  Sad
Offline bahamut

Senior Newbie





« Reply #22 - Posted 2005-10-11 19:30:46 »

Ok Guys,

It seems the GLSL Program is running without any errors. No errors returned from the errorhandler. I shall try the GLSL Code of page 1 combine this with my own picture.
After that I shall report my status...  Grin

Greedz Bahamut Lagoon
Offline bahamut

Senior Newbie





« Reply #23 - Posted 2005-10-12 15:24:55 »

Ok, it seems that the whole GLSL thing is working fine. Thanks all, but we are not done yet. Thanks to this matter, a new question is comming up:

Is there any other way to do false coloring without using GLSL, CG and all other scripts. I mean, can OpenGL do this by using glReadPixels...blabla... glDrawPixels, or something like that???
And why is pixelMap badly supported???
Offline anarchotron

Junior Devvie




...precious bodily fluids.


« Reply #24 - Posted 2005-10-12 15:58:04 »

Well the non-shader way I would do it would be to just take the incoming texture image, which changes every frame anyway, and convert it in Java.  Then pass the converted texture into OpenGL.  This is a fine way to do it if you don't have shader hardware, but it takes a little more CPU time.
Offline Orangy Tang

JGO Kernel


Medals: 56
Projects: 11


Monkey for a head


« Reply #25 - Posted 2005-10-12 16:05:34 »

You could use pallettised textures, however newer hardware has stopped supporting these. And you'd be limited to (IIRC) a 256 colour gradient.

[ TriangularPixels.com - Play Growth Spurt, Rescue Squad and Snowman Village ] [ Rebirth - game resource library ]
Offline bahamut

Senior Newbie





« Reply #26 - Posted 2005-10-12 21:19:16 »

Well the non-shader way I would do it would be to just take the incoming texture image, which changes every frame anyway, and convert it in Java.  Then pass the converted texture into OpenGL.  This is a fine way to do it if you don't have shader hardware, but it takes a little more CPU time.

You mean that the convertion will not be done by OpenGL, but by Java.AWT, if I clearly understand what you are saying. But my CPU is allready 100% busy with everything. So what you are saying is that the shading is more advisable to use then the non-shading way. Correct me if I am not correct.
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #27 - Posted 2005-10-13 11:11:23 »

And why is pixelMap badly supported???
I got the pixelmap support thing from here. I haven't verified this though
http://archives.seul.org/linuxgames/Apr-2004/msg00001.html
Also the minimum size that must be supported is only 32 values.
Maybe you could use this technique as a fallback code path if shaders are not available?
Offline pepijnve

Junior Devvie




Java games rock!


« Reply #28 - Posted 2005-10-13 11:16:04 »

The shader shifts the color index to rgb value work to the gpu, which is probably preferable. The only downside I guess is that using shaders limits the hardware on which your program will work to the last 3 or 4 generations of cards. It's up to you whether that's a problem or not.
Offline bahamut

Senior Newbie





« Reply #29 - Posted 2005-10-16 22:55:33 »

Hi there,

I fixed the GLSL script. This script allows me to change from grayscale to color. That is good, but when I use this script, I lost my black and the white. I am still very new with this... but I hope you guys helping me with my first step  Grin. My colortable will like (from cold to warm)  black, purple, red, yellow, white.
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
uniform sampler2D grayscaleTexture. By the way, I downloaded a great tool for testing the GLSL scripts. Check http://www.typhoonlabs.com 

vec3 convertHsvToRgb ( float H , float S , float V )
{
  int Hi = mod((H / 60.0), 6.0);
  float f = H / 60.0 - Hi;
  float p = V * ( 1.0 - S );
  float q = V * ( 1.0 - ( f * S ) );
  float t = V * ( 1.0 - ( ( 1.0 - f ) * S ) );
  vec3 rgb;

  if ( Hi == 0 )
    rgb = vec3 ( V , t , p );
  if ( Hi == 1 )
    rgb = vec3 ( q , V , p );
  if ( Hi == 2 )
    rgb = vec3 ( p , V , t );
  if ( Hi == 3 )
    rgb = vec3 ( p , q , V );
  if ( Hi == 4 )
    rgb = vec3 ( t , p , V );
  if ( Hi == 5 )
    rgb = vec3 ( V , p , q );
  return rgb;
}

void main ( )
{
  vec4 grayscale = texture2D ( grayscaleTexture , gl_TexCoord[0].st );

  float G = grayscale.r;
  float H = G * 360.0;
  vec3 rgb = convertHsvToRgb ( H , 1.0 , 1.0 );

  gl_FragColor = vec4 ( rgb, 0.0 );
}
Pages: [1] 2
  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.

rwatson462 (30 views)
2014-12-15 09:26:44

Mr.CodeIt (23 views)
2014-12-14 19:50:38

BurntPizza (50 views)
2014-12-09 22:41:13

BurntPizza (84 views)
2014-12-08 04:46:31

JscottyBieshaar (45 views)
2014-12-05 12:39:02

SHC (59 views)
2014-12-03 16:27:13

CopyableCougar4 (57 views)
2014-11-29 21:32:03

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

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

toopeicgaming1999 (32 views)
2014-11-26 15:20:08
Resources for WIP games
by kpars
2014-12-18 10:26:14

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
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!