Java-Gaming.org Hi !
Featured games (91)
games approved by the League of Dukes
Games in Showcase (799)
Games in Android Showcase (236)
games submitted by our members
Games in WIP (865)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  Shaders issue  (Read 119967 times)
0 Members and 1 Guest are viewing this topic.
Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Posted 2014-12-21 20:40:30 »

Hello,

I'm trying to make a light system for my game engine but I've come across a problem which I can't get through.

I have a firecamp and when its dark the light looks cool, when its day it looks normal since there is no light..., but when it starts the transition it reaches a point where the fading gets inverted and it looks so wierd....

I can't find the error on my shader file... please help...

<a href="http://www.youtube.com/v/MBTmyEvSH6E?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/MBTmyEvSH6E?version=3&amp;hl=en_US&amp;start=</a>


Code:
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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
#version 330 compatibility

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform vec2 lightPosition[50];
uniform vec3 lightColor[50];
uniform float lightIntensity[50];
uniform float lightInUse[50];
uniform float lightType[50];
uniform float lightSize[50];
uniform float lightFacing[50];

void main() {      
   float day = dayLight * 2;
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 ocolor = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;
   ocolor = result;
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < 50; i++) {
      if (lightInUse[i] == 1) {  
         vec2 pos = lightPosition[i];
         float distance = length(pos - gl_FragCoord.xy);
         if (pos.x == 0 && pos.y == 0) continue;
         vec3 col = lightColor[i];
         float ints = lightIntensity[i];
         
         float attenuation = 1.0 / distance;
         
         float falloff = 80;
         falloff -= distance / 25.0f / ints;        
             
         if (attenuation >= 0.010) {
            color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;            
            color /= (distance / (ints * falloff));              
            changed = 1;
            num++;
         }
           
      }
   }
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = vec4(color * vec4(day, day, day, day));
   
   vec4 dcolor = vec4(ocolor * vec4(day, day, day, day));  
   
   if (min(dcolor, color) == color) color = dcolor;
   
   if (min(result, color) == color) gl_FragColor = color;
   else gl_FragColor = result;
}



Thank you,
João Lourenco.

PS: If there is a better way of doing this, please tell me, I'm trying to learn more about this.
Offline ra4king

JGO Kernel


Medals: 508
Projects: 3
Exp: 5 years


I'm the King!


« Reply #1 - Posted 2014-12-22 07:17:44 »

I would assume your issue lies with those if statements with 'min' function calls at the end of the code snippet.

Tips:
  • Insert in line 8
    #define LIGHTS_COUNT 50
    and replace all those 50's with LIGHT_COUNT.
  • That if statement on line 39 should come before the length function call on line 38 as that call is pretty expensive (it uses as sqrt).
  • Lines 58 and 60, that outer vec4(...) is not necessary, the multiplication will create a new one already.
  • What is the point of 'ocolor'? The whole behavior and assignments of tex/color/dcolor/ocolor are very strange.... take a closer look at those and simplify that mess.

Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Reply #2 - Posted 2014-12-22 21:17:22 »

Ok so first of all thank you for the awnser and I've changed a few things, I hope its better now...

- Now using the LIGHTS_COUNT.
- If statement on line 39 has been moved.
- The ocolor was the "Original Color" but I've removed it since I can use the result which is also the original color.
- Now on the operations instead of using new vectors I only use the dcolor vector created at the beginning..


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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
#version 330 compatibility
#define LIGHTS_COUNT 50

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform vec2 lightPosition[LIGHTS_COUNT];
uniform vec3 lightColor[LIGHTS_COUNT];
uniform float lightIntensity[LIGHTS_COUNT];
uniform float lightInUse[LIGHTS_COUNT];
uniform float lightType[LIGHTS_COUNT];
uniform float lightSize[LIGHTS_COUNT];
uniform float lightFacing[LIGHTS_COUNT];

void main() {      
   float day = dayLight * 2;
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;
   
   vec4 dcolor = vec4(result * vec4(day, day, day, day));  
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < LIGHTS_COUNT; i++) {
      if (lightInUse[i] == 1) {  
         vec2 pos = lightPosition[i];
         if (pos.x == 0 && pos.y == 0) continue;
         float distance = length(pos - gl_FragCoord.xy);
         vec3 col = lightColor[i];
         float ints = lightIntensity[i];
         
         float attenuation = 1.0 / distance;
         
         float falloff = 80;
         falloff -= distance / 25.0f / ints;        
             
         if (attenuation >= 0.010) {
            color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
           
            color /= (distance / (ints * falloff));
               
            changed = 1;
            num++;
         }
           
      }
   }
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = dcolor;
     
   if (min(dcolor, color) == color) color = dcolor;
   
   if (min(result, color) == color) gl_FragColor = color;
   else gl_FragColor = result;
}
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline pitbuller
« Reply #3 - Posted 2014-12-22 23:36:08 »

1  
2  
if (lightInUse[i] == 1) {  
         if (pos.x == 0 && pos.y == 0) continue;


What are these test? Why both?

I would just send uniform light counter and avoid those branches per light.
Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Reply #4 - Posted 2014-12-23 01:31:13 »

So instead of sending the info if the light is on or off only send the lights that are on right? that makes sence...

I'm trying to learn how to make shaders and only now I'm starting to realize that every operation done on the shader is very heavy... and when I did that if, for example, it was like ... heee there is no problem to check if its on or off on the shader... but there is... and for that I must thank you all.. ur helping a lot with small things...


so new version of the code:

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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
#version 330 compatibility
#define LIGHTS_COUNT 50

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform vec2 lightPosition[LIGHTS_COUNT];
uniform vec3 lightColor[LIGHTS_COUNT];
uniform float lightIntensity[LIGHTS_COUNT];
uniform float lightType[LIGHTS_COUNT];
uniform float lightSize[LIGHTS_COUNT];
uniform float lightFacing[LIGHTS_COUNT];

void main() {      
   float day = dayLight * 2;
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;
   
   vec4 dcolor = vec4(result * vec4(day, day, day, day));  
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < LIGHTS_COUNT; i++) {
      vec2 pos = lightPosition[i];
      if (pos.x == 0 && pos.y == 0) continue;
      float distance = length(pos - gl_FragCoord.xy);
      vec3 col = lightColor[i];
      float ints = lightIntensity[i];
     
      float attenuation = 1.0 / distance;
     
      float falloff = 80;
      falloff -= distance / 25.0f / ints;        
           
      if (attenuation >= 0.010) {
         color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
         
         color /= (distance / (ints * falloff));
           
         changed = 1;
         num++;        
      }
   }
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = dcolor;
     
   if (min(dcolor, color) == color) color = dcolor;
   
   if (min(result, color) == color) gl_FragColor = color;
   else gl_FragColor = result;
}




Thank you,
João Lourenço.
Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Reply #5 - Posted 2014-12-23 02:35:46 »

I've Changed a couple more things...

- Added a new light type which I'm not happy with yet... the effect looks different don't know why yet...
- Removed day variable, the dayLight * 2 is now performed on the java side.

<a href="http://www.youtube.com/v/ZuOhlqAsa6M?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/ZuOhlqAsa6M?version=3&amp;hl=en_US&amp;start=</a>

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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
#version 330 compatibility
#define LIGHTS_COUNT 50

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform vec2 lightPosition[LIGHTS_COUNT];
uniform vec3 lightColor[LIGHTS_COUNT];
uniform float lightIntensity[LIGHTS_COUNT];
uniform float lightType[LIGHTS_COUNT];
uniform float lightSize[LIGHTS_COUNT];
uniform float lightFacing[LIGHTS_COUNT];

void main() {      
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;
   
   vec4 dcolor = vec4(result * vec4(dayLight, dayLight, dayLight, dayLight));  
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < LIGHTS_COUNT; i++) {
      vec2 pos = lightPosition[i];
      if (pos.x == 0 && pos.y == 0) continue;
      float distance = length(pos - gl_FragCoord.xy);
      vec3 col = lightColor[i];
      float ints = lightIntensity[i];
     
      float attenuation = 1.0 / distance;
     
      float falloff = 80;
      falloff -= distance / 25.0f / ints;        
           
      if (attenuation >= 0.010) {
         if (lightType[i] == 1) {
            color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
         
            color /= (distance / (ints * falloff));
           
            changed = 1;
            num++;
         } else if (lightType[i] == 2) {
            float angle = degrees(acos((pos.x - gl_FragCoord.x) / distance));      
            if (pos.y < gl_FragCoord.y) angle = 360 - angle;
           
            float max = (lightFacing[i] + (lightSize[i] / 2));
            float min = (lightFacing[i] - (lightSize[i] / 2));  
            bool spec = false;
           
            if (max > 360) {
               max = max - 360;
               spec = true;
            }
            if ((lightFacing[i] - (lightSize[i] / 2)) < 0) {
               min = 360 - abs(lightFacing[i] - (lightSize[i] / 2));
               spec = true;
            }
     
            if ((angle >= min && angle <= max && !spec) || ((angle >= min || angle <= max) && spec)) {
               color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
           
               color /= (distance / (ints * falloff));
               changed = 1;
               num++;
            }
         }
      }
   }
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = dcolor;
     
   if (min(dcolor, color) == color) color = dcolor;
   
   if (min(result, color) == color) gl_FragColor = color;
   else gl_FragColor = result;
}



And after this changes, I'm officially out of ideas to performance upgrades...
Tomorrow I'm going to try to make the lights look better... don't know how...
If you have any ideas please tell me.. this is my first attempt at making light stuff...


Thanks,
João Lourenço.
Offline Kefwar
« Reply #6 - Posted 2014-12-23 10:47:27 »

Just a little change:
1  
2  
3  
4  
   if (min(dcolor, color) == color) color = dcolor;
   
   if (min(result, color) == color) gl_FragColor = color;
   else gl_FragColor = result;

Avoid branching in shaders as much as possible, they can kill performance.
Use this:
1  
gl_FragColor = min(result, max(dcolor, color));

Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Reply #7 - Posted 2014-12-23 12:07:09 »

Thank you Kefwar, I've no idea why but that solved my darker shadow when it was day....

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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
#version 330 compatibility
#define LIGHTS_COUNT 50

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform vec2 lightPosition[LIGHTS_COUNT];
uniform vec3 lightColor[LIGHTS_COUNT];
uniform float lightIntensity[LIGHTS_COUNT];
uniform float lightType[LIGHTS_COUNT];
uniform float lightSize[LIGHTS_COUNT];
uniform float lightFacing[LIGHTS_COUNT];

void main() {      
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;
   
   vec4 dcolor = vec4(result * vec4(dayLight, dayLight, dayLight, dayLight));  
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < LIGHTS_COUNT; i++) {
      vec2 pos = lightPosition[i];
      if (pos.x == 0 && pos.y == 0) continue;
      float distance = length(pos - gl_FragCoord.xy);
      vec3 col = lightColor[i];
      float ints = lightIntensity[i];
     
      float attenuation = 1.0 / distance;
     
      float falloff = 80;
      falloff -= distance / 25.0f / ints;        
           
      if (attenuation >= 0.010) {
         if (lightType[i] == 1) {
            color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
         
            color /= (distance / (ints * falloff));
           
            changed = 1;
            num++;
         } else if (lightType[i] == 2) {
            float angle = degrees(acos((pos.x - gl_FragCoord.x) / distance));      
            if (pos.y < gl_FragCoord.y) angle = 360 - angle;
           
            float max = (lightFacing[i] + (lightSize[i] / 2));
            float min = (lightFacing[i] - (lightSize[i] / 2));  
            bool spec = false;
           
            if (max > 360) {
               max = max - 360;
               spec = true;
            }
            if ((lightFacing[i] - (lightSize[i] / 2)) < 0) {
               min = 360 - abs(lightFacing[i] - (lightSize[i] / 2));
               spec = true;
            }
     
            if ((angle >= min && angle <= max && !spec) || ((angle >= min || angle <= max) && spec)) {
               color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
           
               color /= (distance / (ints * falloff));
               changed = 1;
               num++;
            }
         }
      }
   }
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = dcolor;
     
   gl_FragColor = min(result, max(dcolor, color));
}



Thank you,
João Lourenço.
Offline joaogl

Junior Devvie


Medals: 5
Exp: 4 years



« Reply #8 - Posted 2014-12-23 13:41:56 »

A couple of changes I made once more...

- Removed the attenuation if.
- I now pass in a variable with the lights amount to avoid the for loop trying to work unexistent lights.

<a href="http://www.youtube.com/v/VLiyF5iZj5U?version=3&amp;hl=en_US&amp;start=" target="_blank">http://www.youtube.com/v/VLiyF5iZj5U?version=3&amp;hl=en_US&amp;start=</a>

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  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
#version 330 compatibility
#define LIGHTS_COUNT 50

uniform sampler2D texture;
in vec2 texCoords;

uniform float dayLight;

uniform int lightAmount;

uniform vec2 lightPosition[LIGHTS_COUNT];
uniform vec3 lightColor[LIGHTS_COUNT];
uniform float lightIntensity[LIGHTS_COUNT];
uniform float lightType[LIGHTS_COUNT];
uniform float lightSize[LIGHTS_COUNT];
uniform float lightFacing[LIGHTS_COUNT];

void main() {      
   vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
   vec4 tex = texture2D(texture, gl_TexCoord[0].st);
   color = tex;
     
   float alpha = 1.0;
   if (tex.x == 1.0 && tex.y == 0.0 && tex.z == 1.0) {
      alpha = 0.0;
   }
   
   vec4 result = vec4(color.xyz, alpha);
   color = result;  
   vec4 dcolor = vec4(result * vec4(dayLight, dayLight, dayLight, dayLight));  
   
   int num = 0;
   int changed = 0;        
   
   for (int i = 0; i < lightAmount; i++) {
      vec2 pos = lightPosition[i];
      if (pos.x == 0 && pos.y == 0) continue;
      vec3 col = lightColor[i];
      float ints = lightIntensity[i];
     
      float distance = length(pos - gl_FragCoord.xy);
      float attenuation = 1.0 / distance;
     
      float falloff = 50 - distance / 5.0f / ints;        
           
      if (lightType[i] == 1) {
         color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
     
         color /= (distance / (ints * falloff));
         
         changed = 1;
         num++;
      } else if (lightType[i] == 2) {
         float angle = degrees(acos((pos.x - gl_FragCoord.x) / distance));      
         if (pos.y < gl_FragCoord.y) angle = 360 - angle;
         
         float max = (lightFacing[i] + (lightSize[i] / 2));
         float min = (lightFacing[i] - (lightSize[i] / 2));  
         bool spec = false;
         
         if (max > 360) {
            max = max - 360;
            spec = true;
         }
         if ((lightFacing[i] - (lightSize[i] / 2)) < 0) {
            min = 360 - abs(lightFacing[i] - (lightSize[i] / 2));
            spec = true;
         }
   
         if ((angle >= min && angle <= max && !spec) || ((angle >= min || angle <= max) && spec)) {
            color *= vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4((col / distance * 15) * ints, 1.0) + 0.01;
         
            color /= (distance / (ints * falloff));
            changed = 1;
            num++;
         }
      }
   }
   
   if (changed == 1) color *= 30.0 * pow(166.0, float(num - 1)) + 1;
   else color = dcolor;
     
   gl_FragColor = min(result, max(dcolor, color));
}



I don't think I can make the Point light any better now... At least I don't have any Ideas for now...
The SpotLight in the other hand, has still a few adjustments to be done.. For some reason the shader only works for the first light that is passed in... I've confirmed in the java side that I'm passing in both lights.

If anyone knows why the shader is only processing one light please tell me...


Thank you,
João Lourenço.
Offline pitbuller
« Reply #9 - Posted 2014-12-26 20:54:25 »

1  
 if (pos.x == 0 && pos.y == 0) continue;

What is this?




In other matter. Always sort by type instead of doing redudant tests per pixel in inner loop.(1920 * 1080 * 50lights * 60fps = 6220800000 dynamic branches per second for no reason)

So instead of doing light type test there you create two loops. One for point lights and one for that special lights. Both have their counter and their own uniforms.
Pages: [1]
  ignore  |  Print  
 
 

 
Riven (185 views)
2019-09-04 15:33:17

hadezbladez (4864 views)
2018-11-16 13:46:03

hadezbladez (1785 views)
2018-11-16 13:41:33

hadezbladez (5136 views)
2018-11-16 13:35:35

hadezbladez (1016 views)
2018-11-16 13:32:03

EgonOlsen (4367 views)
2018-06-10 19:43:48

EgonOlsen (5215 views)
2018-06-10 19:43:44

EgonOlsen (2946 views)
2018-06-10 19:43:20

DesertCoockie (3867 views)
2018-05-13 18:23:11

nelsongames (4293 views)
2018-04-24 18:15:36
Java Gaming Resources
by philfrei
2019-05-14 16:15:13

Deployment and Packaging
by philfrei
2019-05-08 15:15:36

Deployment and Packaging
by philfrei
2019-05-08 15:13:34

Deployment and Packaging
by philfrei
2019-02-17 20:25:53

Deployment and Packaging
by mudlee
2018-08-22 18:09:50

Java Gaming Resources
by gouessej
2018-08-22 08:19:41

Deployment and Packaging
by gouessej
2018-08-22 08:04:08

Deployment and Packaging
by gouessej
2018-08-22 08:03:45
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!