Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 08, 2025 18:51

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: WebGL GWT
BeitragVerfasst: Sa Jan 16, 2010 18:38 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Ich bins mal wieder. Auf Basis des WebGL Tutorials aus dem Wiki, einem anderen Tutorial (http://learningwebgl.com/blog/?p=28) und dem GWT habe ich angefangen, mit GWT WebGL in Java zu implementieren. Allerdings lässt sich das Wiki WebGL Tutorial aus irgendeinem Grund nicht richtig umsetzen..

Ich sehe.. nichts :D

Wobei Nichts im Grunde ein Schwarzes Canvas ist, das sogar korrekter Weise Schwarz ist, da die ClearColor auf schwarz gesetzt wurde. Die Farbe des Canvas verändert sich auch, wenn ich ClearColor verändere, also zumindest das sollte stimmen.

Nun frage ich mich, wieso also der restliche Quellcode nicht funktioniert, der ja hauptsächlich noch aus den Shadern besteht. Es bietet sich im moment kaum eine Möglichkeit, das irgendwie zu debuggen, weil dieses Debugplugin für Minefield irgendwie nicht funktioniert. Ich poste einfach mal ein bisschen Code:

Anmerkung: gl ist eine Instanz der Klasse, die die Methodenaufrufe per JNI kapselt.
Code:
  1.  
  2.     public void onModuleLoad()
  3.     {
  4.         instance = this;
  5.  
  6. // GWT Elemente
  7.         final HTML html = new HTML("<canvas id=\"canvas\"></canvas>");
  8.         final FocusPanel focusPanel = new FocusPanel(html);
  9.         focusPanel.setStyleName("focus");
  10.         RootPanel.get().add(focusPanel);
  11.         focusPanel.setFocus(true);
  12.  
  13.         scheduleRepeating(2);
  14.    
  15.         gl.clearColor(0, 0, 0, 1);
  16.         gl.enable(gl.DEPTH_TEST);
  17.  
  18.        
  19.     // Shader aus dem Tutorial frei reinkopiert, liegts vielleicht schon hier?
  20.    
  21.         String vertexShaderSource = "attribute vec3 aPosition;"+
  22. "attribute vec3 aNormal;"+
  23. "attribute vec2 aTexCoord;"+
  24. "varying vec3 vNormal;"+
  25. "varying vec2 vTexCoord; "+
  26. "void main() {"+
  27.  "   gl_Position = vec4(aPosition, 1.0);"+
  28.  "   vTexCoord = aTexCoord;"+
  29.  "   vNormal = aNormal;"+
  30. "}";
  31.         String fragmentShaderSource = "varying vec3 vNormal;"+
  32. "varying vec2 vTexCoord;"+
  33. "uniform sampler2D uTexture;"+
  34. "void main() {"+
  35. "    gl_FragColor = texture2D(uTexture, vTexCoord);"+
  36. "}";
  37.          
  38.         JavaScriptObject vertexShader = loadShader(WebGL.VERTEX_SHADER, vertexShaderSource);
  39.         JavaScriptObject fragmentShader = loadShader(WebGL.FRAGMENT_SHADER, fragmentShaderSource);
  40.         if (vertexShader == null || fragmentShader == null) {
  41.             System.out.println("Shader problem");
  42.         }
  43.          
  44.         // create program object
  45.         program = gl.createProgram();
  46.          
  47.         // attach our two shaders to the program
  48.         gl.attachShader(program, vertexShader);
  49.         gl.attachShader(program, fragmentShader);
  50.          
  51.         // setup attributes (optional)
  52.         gl.bindAttribLocation(program, 0, "aPosition");
  53.         gl.bindAttribLocation(program, 1, "aNormal");
  54.         gl.bindAttribLocation(program, 2, "aTexCoord");
  55.          
  56.         // linking
  57.     //  gl.linkProgram(program);
  58.     //  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
  59.     //      alert(gl.getProgramInfoLog(program));
  60.     //  }
  61.          
  62.         // setup uniforms (optional)
  63.         gl.useProgram(program);
  64.         gl.uniform1i(gl.getUniformLocation(program, "uTexture"), 0);   
  65.        
  66.         // define some vertexdata
  67.         float[] vertices = {
  68.             // position XYZ, normal XYZ, texcoord UV => 8 floats per vertex
  69.             -0.5f,  0.5f,  0.0f,  0.6f,  0.0f,  0.8f,  0.0f,  0.0f,
  70.              0.5f,  0.5f,  0.0f,  0.6f,  0.0f,  0.8f,  1.0f,  0.0f,
  71.             -0.5f, -0.5f,  0.0f,  0.0f,  0.0f,  1.0f,  0.0f,  1.0f,
  72.              0.5f, -0.5f,  0.0f,  0.0f,  0.6f,  0.8f,  1.0f,  1.0f,
  73.         };
  74.         // we need also some indices because of this annoying Firefox-Bug:
  75.         short[] indices ={
  76.            0, 1, 2, 2, 1, 3
  77.         };
  78.         // create VBO & IBO
  79.         vbo = gl.createBuffer();
  80.         gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  81.         gl.bufferData(gl.ARRAY_BUFFER, WebGLFloatArray.create(vertices), gl.STATIC_DRAW);
  82.         ibo = gl.createBuffer();
  83.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
  84.         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, WebGLUnsignedShortArray.create(indices), gl.STATIC_DRAW);
  85.          
  86.  
  87.     }
  88.  
  89.  
  90.     public void run()
  91.     {
  92.        
  93.         gl.viewport(0, 0, 400, 400);
  94.         gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT );
  95.  
  96.         // setup shader
  97.         gl.useProgram(program);
  98.  
  99.         // setup interleaved VBO and IBO
  100.         gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  101.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
  102.         gl.enableVertexAttribArray(0);
  103.         gl.enableVertexAttribArray(1);
  104.         gl.enableVertexAttribArray(2);
  105.         gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 8*4, 0*4); // position
  106.         gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 8*4, 3*4); // normal
  107.         gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8*4, 6*4); // texcoord
  108.  
  109.         // draw the buffer
  110.         gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);
  111.        
  112.        
  113.        
  114.         }
  115.  
  116.  
  117.  

Ich habe die Textur erstmal rausgelassen, weil ich noch nicht wusste, wie ich das Image aus dem Wikiartikel in GWT umsetzen kann. Eigentlich wollte ich einfach erstmal was sehen, um zu wissen, ob ich auf dem Richtigen Weg bin ^^

Danke schonmal für eure hilfe


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: Sa Jan 16, 2010 22:25 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du deinen Code mal in Pascal oder halt richtigem OGL getestet? WebGL ist ja ein OGL 3(?) subset, und sollte auch in einer Hochsprache funktionieren (mit anderer Initialisierung).

Das würde erstmal prinzipielle Probleme ausschließen...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 00:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Dein Shader wird nicht gelinkt...die Zeile ist auskommentiert.

Übrigens gibt es mittlerweile 3 verschiedene GWT-Wrapper für WebGL, also du musst das Rad nicht neu erfinden:
http://khronos.org/webgl/wiki/User_Cont ... t_bindings
WGT ist natürlich der Wrapper von mir. ;)

Zitat:
Es bietet sich im moment kaum eine Möglichkeit, das irgendwie zu debuggen, weil dieses Debugplugin für Minefield irgendwie nicht funktioniert.

WGT bietet dir eine Log-Klasse an, damit kannst du Meldungen raushauen. Wenn du das DefaultLog benutzt werden die Nachrichten einfach als div-Boxen dargestellt in eine übergeordnete div-Box geworfen. Auch ist natürlich die JavaScript-Konsole von Minefield immer recht hilfreich.

@Flash: WebGL basiert auf OpenGL ES 2.0, was Ähnlichkeiten zu OpenGL 3.1 aufweist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 13:07 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay das war in der Tat ein dummer Fehler dessen Ausmertzung leider nicht zum gewünschten Erfolg geführt hat. Auch nach dem Ent-Auskommentieren der LinkZeile bleibt alles schwarz.

Ich weiss schon, dass es einige Frameworks gibt. Allerdings wollte ich vorerst einfach mal schauen, wie sich das ganze WebGL gestaltet und wie schwer/leicht die Implementierung ist. Vielleicht nutze ich danach ein Framework (dann wohl eher deines, weil da die Kommunikationswege zum "Support" unproblematischer wären ^^) aber im Moment würde ich gern erstmal diese Demo zum Laufen bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 14:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich habe die Textur erstmal rausgelassen, weil ich noch nicht wusste, wie ich das Image aus dem Wikiartikel in GWT umsetzen kann.

Ich würde mal sagen darum siehst du auch nix, weil keine Textur gebunden ist. Du musst den Shader entsprechend ändern.

Das mit dem Image musst du über JSNI umsetzen. Bei mir sieht das so aus:
Code:
  1. private TextureObject tex;
  2. private ImageObject image;
  3. private boolean mipmap;
  4. private String url;
  5.  
  6. protected void onLibraryAvailable(Library lib) {
  7.  
  8.     // ...read texture info from library...
  9.  
  10.  
  11.     // create texture
  12.     tex = gl.createTexture();
  13.     gl.bindTexture(gl.TEXTURE_2D, tex);
  14.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
  15.     gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
  16.  
  17.     image = createImage(GWT.getHostPageBaseURL() + url);
  18. }
  19.  
  20. private native ImageObject createImage(String url) /*-{
  21.     var self = this;
  22.     var image = new Image();
  23.     image.onload = function() {
  24.         self.@com.delphigl.wgt.resource.Texture2D::onLoad()();
  25.     }
  26.     image.onerror = function() {
  27.         self.@com.delphigl.wgt.resource.Texture2D::onError()();
  28.     }
  29.     image.src = url;
  30.     return image;
  31. }-*/;
  32.  
  33. private void onLoad() {
  34.     gl.bindTexture(gl.TEXTURE_2D, tex);
  35.     gl.texImage2D(gl.TEXTURE_2D, 0, image);
  36.     if (mipmap) {
  37.         gl.generateMipmap(gl.TEXTURE_2D);
  38.     }
  39.     image = null;
  40.     setState(ResourceState.AVAILABLE);
  41. }
  42.  
  43. private void onError() {
  44.     image = null;
  45.     Log.error("error while loading image '"+url+"'.");
  46.     setState(ResourceState.ERROR);
  47. }


ImageObject ist einfach nur ein Overlay für die JavaScript-Klasse Image um Typsicherheit zu erreichen. Für TextureObject gilt das gleiche:
Code:
  1. public class ImageObject extends JavaScriptObject {
  2.     protected ImageObject() { }
  3. }
  4.  
  5. public class TextureObject extends JavaScriptObject {
  6.     protected TextureObject() { }
  7. }
  8.  

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 16:08 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Mh ich hatte gehofft, dass man evtl trotzdem einfach nur ein weißes Viereck sehen würde^^


Okay also ich hab das mal umgesetzt:

Code:
  1. public void onModuleLoad()
  2. //.... Quellcode ala oben
  3.  
  4.         short[] indices ={
  5.            0, 1, 2, 2, 1, 3
  6.         };
  7.         // create VBO & IBO
  8.         vbo = gl.createBuffer();
  9.         gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
  10.         gl.bufferData(gl.ARRAY_BUFFER, WebGLFloatArray.create(vertices), gl.STATIC_DRAW);
  11.         ibo = gl.createBuffer();
  12.         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);
  13.         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, WebGLUnsignedShortArray.create(indices), gl.STATIC_DRAW);
  14.          
  15.         // ...
  16.         // create texture
  17.         // =================================================
  18.         tex = gl.createTexture();
  19.         gl.bindTexture(gl.TEXTURE_2D, tex);
  20.         gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
  21.         gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  22.      
  23.         image = createImage("http://wiki.delphigl.com/wiki.png");
  24.         // draw scene every 33 milliseconds
  25.    
  26.     }
  27.  
  28.     public native ImageObject createImage(String url) /*-{
  29.     var self = this;
  30.     var image = new Image();
  31.     image.onload = function() {
  32.     }
  33.     image.onerror = function() {
  34.     }
  35.     image.src = url;
  36.     return image;
  37. }-*/;
  38.  
  39. private void onLoad() {
  40.     gl.bindTexture(WebGL.TEXTURE_2D, tex);
  41.     gl.texImage2D(WebGL.TEXTURE_2D, 0, image);
  42.  //   if (mipmap) {
  43.         gl.generateMipmap(gl.TEXTURE_2D);
  44.   //  }
  45.     image = null;
  46.   //  setState(ResourceState.AVAILABLE);
  47. }
  48.  
  49. private void onError() {
  50.  //   image = null;
  51.   //  Log.error("error while loading image '"+url+"'.");
  52.  //   setState(ResourceState.ERROR);
  53. }  

Ich hab das jetzt logischerweise erstmal weitgehend kopiert. Leider bleibt noch immer alles schwarz


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 16:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Mh ich hatte gehofft, dass man evtl trotzdem einfach nur ein weißes Viereck sehen würde^^

Ich hätte jetzt angenommen das das Viereck schwarz ist. Gut jetzt sollte die Textur aber da sein.

Hm, kA was da falsch ist....gibt es wirklich keine Fehlermeldungen in der JavaScript-Konsole (Strg+Shift+J)?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 16:37 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
oha da steht was ^^

Zitat:
Init is not defined
file://....SampleProject.html Line:1

Nun hab ich also meine .html aufgemacht und da stand tatsächlich noch ein <body onLoad="init()">
Das hab ich erstmal beseitigt, weil im Grunde die GWT onModuleLoad() das schon alles übernehmen sollte oder?

Allerdings auch nach dem entfernen des Init(), bleibt der obige Fehler bestehen. Im Quelltext der Seite existiert der aufruf im Body-onLoad aber nichtmehr. Eigenartigt ist auch, dass die Errorkonsole in Zeile 1 anzeigt, obwohl das in einer ganz anderen Zeile steht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 16:43 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Korrekt, onModuleLoad ist der Eintrittspunkt von GWT.

Die Fehler bleiben solange bis du die Konsole leerst. Also Konsole leeren und Refreshen. Am besten auch gleich den Cache
löschen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 17:05 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Okay ^^ Ich hab die Konsole geleert und der Fehler ist weg
Dennoch bleibt alles schwarz


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 17:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wird den dein Code überhaupt ausgeführt? Vielleicht am Ende von run() ein Window.alert("blubb") oder so einbauen. (Es ist sinnvoll dafür das Timerintervall auf 2 Sekunden oder mehr zu setzen...)

Ansonsten checke bei deinem Wrapper mal ob vielleicht irgendwo eine Funktion falsch umgesetzt wird.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: So Jan 17, 2010 17:47 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also das Alert habe ich getestet und das wird ausgelöst
Ansonsten habe ich mal alle Methoden, die ich vom Wrapper aufrufe überprüft, und nehme an, dass die so stimmen sollten..

Die Konsole sagt nun nur noch Infomessages:
Zitat:
Canvas 3D: creating PBuffer....
Canvas 3D: ready


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: Mo Jan 18, 2010 18:22 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Also ich hab noch ne weile durchgetestet und mit ein paar Alerts debuggt. Die Arrays werden korrekt angelegt und die Images/Texturen offenbar auch erzeugt. Die Run wird regelmäßig aufgerufen und auch ansonsten scheinen die Eventlistener des Images usw zu funktionieren und zu reagieren.
Ich bin etwas ratlos


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: Mo Jan 18, 2010 21:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ideen:
Benutzt du vielleicht noch eine alte Version von Minefield?

Irgendwo Backface-Culling aktiviert oder sowas?

Lass den Shader mal einfach nur eine Farbe ausgeben die sich vom Hintergrund unterscheidet um sicherzustellen das es nicht an der Textur liegt.

Werf mal alle Vertexattribute bis auf Position raus (auch VBO entsprechend anpassen)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: WebGL GWT
BeitragVerfasst: Di Jan 19, 2010 21:11 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
@ MinefieldVersion: Ich update das eigentlich sehr regelmäßig. Ich hab derzeit 3.7a1pre

@ Backfaceculling: Ist zumindest nicht explizit aktiviert und damit doch defaultmäßig deaktiviert oder? nur Depthtesting ist aktivier

@ Shaderangleichung:

Code:
  1.  
  2. String vertexShaderSource = "attribute vec3 aPosition;"+
  3. "void main() {"+
  4.  "   gl_Position = vec4(aPosition, 1.0);"+
  5. "}";
  6. String fragmentShaderSource = "void main() {"+
  7. "    gl_FragColor = vec4(1.0,1.0,1.0,1.0);"+
  8. "}";
  9.  

Ich hab noch nich viel mit Shadern gemacht, aber das müsste so stimmen oder? ^^

Entsprechende Angleichung im VBO (gut, dass du darauf hingewiesen hast, ich hätte es prompt vergessen..)
Code:
  1.  
  2.         // define some vertexdata
  3.         float[] vertices = {
  4.             // position XYZ, normal XYZ, texcoord UV => 8 floats per vertex
  5.             -0.5f,  0.5f,  0.0f,  //0.6f,  0.0f,  0.8f,  0.0f,  0.0f,
  6.              0.5f,  0.5f,  0.0f, // 0.6f,  0.0f,  0.8f,  1.0f,  0.0f,
  7.             -0.5f, -0.5f,  0.0f,  //0.0f,  0.0f,  1.0f,  0.0f,  1.0f,
  8.              0.5f, -0.5f,  0.0f,  //0.0f,  0.6f,  0.8f,  1.0f,  1.0f,
  9.         };


Es bleibt leider weiterhin alles schwarz (clearColor ist 0,0,0,1 und die glFragcolor sollte ja ein weißes Viereck reinzeichnen)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.017s | 19 Queries | GZIP : On ]