[B3D] Echter Blur V.1.2

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: [B3D] Echter Blur V.1.2

BeitragMo, Nov 12, 2007 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
24.12.2007
Bugfix: Jetzt funktionieren tatsächlich alle Bildformate. Hatte da noch was nicht richtig übertragen Embarassed
Update: Skallierung des Blurs (von 0 bis 1) wird nun näher (linearer) der Warnehmung vorgenommen.


Ich weiß schon, es gibt so viele Blurlibrarys wie Sand am Meer. Doch keines von dem was ich bisher gefunden habe, war auch ein echter Blur oder wirklich für meine Zwecke anwendbar. So wird ein Motionblur plötzlich als nur Blur benannt. Das gleiche gilt auch für Zoomblur und Radialblur. Echte Blureffekte gibt es zwar auch, doch haben diese meistens den Nachteil, dass sie sehr verpixelt aussehen.

Mein Ziel war es also:

- Motionblur so weit es geht einzudämmen
- Verpixelte Stellen so weit wie möglich gering zu halten
- Vor allem keine Zoomveränderung aus dem Originalbild

Folgende Lib kann von sich aus gestartet werden. Will man die Lib für eigene Projekte verwenden, so muss lediglich der letzte Codeabschnitt (über Kommentare eingegrenzt) gelöscht werden.

Edit1: Neue Version 1.2

- Blur nun auch bei allen Bildschirmverhältnisen möglich (danke an Silver_Knee)
- Blur bei Volllast (also '=1') ist nun sowas wie trübsal, was man beim sterben anweden kann.
- CamerRange -Problem dadurch gelöst, dass sich nun die Quads mit Abstand von 100 befinden.
- Kleine Korrektur an den Seitenrändern rechts und unten gemacht.

Code: [AUSKLAPPEN]
;Public Domain
;Real-Blur V.1.2
Global BlurMesh1
Global BlurMesh2
Global BlurMesh3
Global BlurFace
Global BlurAngle
Global BlurTexture
Global BlurXScreen
Global BlurYScreen
Global BlurScreen#
Const BLURWIDTH#=0.8
Const BLURDEPTH%=512 ;256




Function CreateBlur(FCamera%)
   BlurXScreen=GraphicsWidth()
   BlurYScreen=GraphicsHeight()
   BlurScreen=Float(BlurYScreen)/Float(BlurXScreen)
   
   BlurMesh1=CreateMesh(FCamera)
   BlurFace=CreateSurface(BlurMesh1)
   BlurTexture=CreateTexture(BLURDEPTH,BLURDEPTH,257)
   
   EntityTexture BlurMesh1,BlurTexture
   TextureBlend BlurTexture,2
   EntityAlpha BlurMesh1,0
   EntityFX BlurMesh1,9
   
   AddVertex(BlurFace,-100.8,+BlurScreen*100+0.8,100, 0.5/BLURDEPTH-0.004 ,0.5/BLURDEPTH-0.004)
   AddVertex(BlurFace,+100.8,+BlurScreen*100+0.8,100, 0.5/BLURDEPTH+1.004 ,0.5/BLURDEPTH-0.004)
   AddVertex(BlurFace,+100.8,-BlurScreen*100-0.8,100, 0.5/BLURDEPTH+1.004 ,0.5/BLURDEPTH+BlurScreen+0.004)
   AddVertex(BlurFace,-100.8,-BlurScreen*100-0.8,100, 0.5/BLURDEPTH-0.004 ,0.5/BLURDEPTH+BlurScreen+0.004)
   AddTriangle BlurFace,0,1,2
   AddTriangle BlurFace,2,3,0
   
   BlurMesh2=CopyEntity(BlurMesh1)
   BlurMesh3=CopyEntity(BlurMesh1)
   EntityParent BlurMesh2,FCamera
   EntityParent BlurMesh3,FCamera
   EntityOrder BlurMesh1,-101
   EntityOrder BlurMesh2,-102
   EntityOrder BlurMesh3,-103
End Function




Function UpdateBlur(FCamera%,FSmooth#=0)
   If FSmooth>=0 Then
      FSmooth#=(1-(1.0/(1+FSmooth*4)))*1.2 ;1.25
      EntityAlpha BlurMesh1,FSmooth
      EntityAlpha BlurMesh2,FSmooth/(1+FSmooth)
      EntityAlpha BlurMesh3,FSmooth/(1+(2*FSmooth))
      BlurAngle=(BlurAngle+181) Mod 360
      PositionEntity BlurMesh1,Cos(BlurAngle+000)*FSmooth*BLURWIDTH,Sin(BlurAngle+000)*FSmooth*BLURWIDTH,0
      PositionEntity BlurMesh2,Cos(BlurAngle+120)*FSmooth*BLURWIDTH,Sin(BlurAngle+120)*FSmooth*BLURWIDTH,0
      PositionEntity BlurMesh3,Cos(BlurAngle+240)*FSmooth*BLURWIDTH,Sin(BlurAngle+240)*FSmooth*BLURWIDTH,0
      CameraViewport FCamera,0,0,BLURDEPTH,BLURDEPTH*BlurScreen:RenderWorld
      CopyRect 2,2,BLURDEPTH-3,BLURDEPTH*BlurScreen-3,2,2,BackBuffer(),TextureBuffer(BlurTexture)
      CameraViewport FCamera,0,0,BlurXScreen,BlurYScreen
   Else   
      EntityAlpha BlurMesh1,0
      EntityAlpha BlurMesh2,0
      EntityAlpha BlurMesh3,0
   End If
   RenderWorld   
End Function




Function FreeBlur()
   FreeTexture BlurTexture
   FreeEntity BlurMesh1
   FreeEntity BlurMesh2
   FreeEntity BlurMesh3
End Function




;######################## AB HIER NUR ZUR VERANSCHAULICHUNG ########>>>>
;######## DER CODE DADRÜBER KANN ALS INCLUDE BENUTZT WERDEN ########>>>>

Graphics3D 800,600,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
Local Light=CreateLight()
TurnEntity Light,40,-60,0
Local Mover=CreateSprite()
ScaleSprite Mover,2,10
EntityColor Mover,255,0,0
MoveEntity Mover,-12,0,10
Local Cube=CreateCube()
TurnEntity Cube,-30,0,0
MoveEntity Cube,0,-2,3
Local BlurPower#=.5

CreateBlur(Camera) ;BLUR INITIALISIEREN

While Not KeyHit(1)
   TranslateEntity Mover,.02,0,0
   If EntityX(Mover)>12 Then PositionEntity Mover,-12,0,10
   If KeyDown(203) Then BlurPower=BlurPower-.01:If BlurPower<0 Then BlurPower=0
   If KeyDown(205) Then BlurPower=BlurPower+.01:If BlurPower>1 Then BlurPower=1
   TurnEntity Cube,0,.2,0
   
   UpdateBlur(Camera,BlurPower) ;BLUR ANWENDEN (KEIN RENDERWORLD ANWENDEN)
   
   Rect 20,20,400,10,0
   Rect 20,20,BlurPower*400,10,1
   Text 20,40,"Cursor links/rechts"
   Text 20,60,"Blur-Stärke "+BlurPower
   WaitTimer(Timer)
   Flip 0
Wend

FreeBlur()
End

;<<<<####################### BIS HIER NUR ZUR VERANSCHAULICHUNG ########
;<<<<######## DER CODE DADRÜBER KANN ALS INCLUDE BENUTZT WERDEN ########


Hier ein Screenshot komplett unbearbeitet:

user posted image

Blurwerte gehen von 0 bis 1

Viel Spaß damit
  • Zuletzt bearbeitet von hectic am Fr, Aug 28, 2009 18:44, insgesamt 6-mal bearbeitet
 

FWeinb

ehemals "ich"

BeitragDi, Nov 13, 2007 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr Geil
aber ich würde noch mehr werte nehemn grade der Wert 1.450 ist für ein Tot im Ego-Shooter Sehr geil einzusetzen weil das bild ja immer kleiner wird.

Aber Respeckt für die Arbeit sieht super aus.

Und ist auch SIcherlich Fullspeed Fähig.
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Silver_Knee

BeitragDi, Nov 13, 2007 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
So nun läuft es (theoretisch) auf allen Auflösungen.

ich habe festgestellt, dass der Faktor 0.75 ,der hin und wieder auftaucht, Y/X entspricht. Ich habe also eine neue Global eingeführt: BlurScreen# und darein die Y/X gespeichert und alles entsprechend ersetzt.

Tested: 800*600;1280*1024;1280*960

Code: [AUSKLAPPEN]
Global BlurMesh1
Global BlurMesh2
Global BlurMesh3
Global BlurFace
Global BlurAngle
Global BlurTexture
Global BlurXScreen
Global BlurYScreen
Global BlurScreen#
Const BLURWIDTH#=0.008
Const BLURDEPTH%=256




Function CreateBlur(FCamera%)
   BlurXScreen=GraphicsWidth()
   BlurYScreen=GraphicsHeight()
   BlurScreen=Float(BlurYScreen)/Float(BlurXScreen)

   BlurMesh1=CreateMesh(FCamera)
   BlurFace=CreateSurface(BlurMesh1)
   BlurTexture=CreateTexture(BLURDEPTH,BLURDEPTH,257)
   
   EntityTexture BlurMesh1,BlurTexture
;   EntityColor BlurMesh1,255,224,224
   TextureBlend BlurTexture,2
   EntityOrder BlurMesh1,-100
   EntityAlpha BlurMesh1,0
   EntityFX BlurMesh1,9
   
;   AddVertex(BlurFace,-1,+0.75,1, 0.5/BLURDEPTH   ,0.5/BLURDEPTH)
;   AddVertex(BlurFace,+1,+0.75,1, 0.5/BLURDEPTH+1 ,0.5/BLURDEPTH)
;   AddVertex(BlurFace,+1,-0.75,1, 0.5/BLURDEPTH+1 ,0.5/BLURDEPTH+0.75)
;   AddVertex(BlurFace,-1,-0.75,1, 0.5/BLURDEPTH   ,0.5/BLURDEPTH+0.75)
   AddVertex(BlurFace,-1.008,+BlurScreen+0.008,1, 0.5/BLURDEPTH-0.004 ,0.5/BLURDEPTH-0.004)
   AddVertex(BlurFace,+1.008,+BlurScreen+0.008,1, 0.5/BLURDEPTH+1.004 ,0.5/BLURDEPTH-0.004)
   AddVertex(BlurFace,+1.008,-BlurScreen-0.008,1, 0.5/BLURDEPTH+1.004 ,0.5/BLURDEPTH+BlurScreen+0.004)
   AddVertex(BlurFace,-1.008,-BlurScreen-0.008,1, 0.5/BLURDEPTH-0.004 ,0.5/BLURDEPTH+BlurScreen+0.004)
   AddTriangle BlurFace,0,1,2
   AddTriangle BlurFace,2,3,0
   
   BlurMesh2=CopyEntity(BlurMesh1)
   BlurMesh3=CopyEntity(BlurMesh1)
   EntityParent BlurMesh2,FCamera
   EntityParent BlurMesh3,FCamera
End Function




Function UpdateBlur(FCamera%,FSmooth#=0)
   If FSmooth>=0 Then
      FSmooth#=(1-(1.0/(1+FSmooth*2)))*1.35
      EntityAlpha BlurMesh1,FSmooth
      EntityAlpha BlurMesh2,FSmooth/(1+FSmooth)
      EntityAlpha BlurMesh3,FSmooth/(1+(2*FSmooth))
      BlurAngle=(BlurAngle+181) Mod 360
      PositionEntity BlurMesh1,Cos(BlurAngle+000)*FSmooth*BLURWIDTH,Sin(BlurAngle+000)*FSmooth*BLURWIDTH,0
      PositionEntity BlurMesh2,Cos(BlurAngle+120)*FSmooth*BLURWIDTH,Sin(BlurAngle+120)*FSmooth*BLURWIDTH,0
      PositionEntity BlurMesh3,Cos(BlurAngle+240)*FSmooth*BLURWIDTH,Sin(BlurAngle+240)*FSmooth*BLURWIDTH,0
      CameraViewport FCamera,0,0,BLURDEPTH,BLURDEPTH*BlurScreen:RenderWorld
;      CopyRect 0,0,256,192,0,0,BackBuffer(),TextureBuffer(BlurTexture)
      CopyRect 2,2,BLURDEPTH-4,BLURDEPTH*BlurScreen-4,2,2,BackBuffer(),TextureBuffer(BlurTexture)
      CameraViewport FCamera,0,0,BlurXScreen,BlurYScreen:RenderWorld
   Else   
      EntityAlpha BlurMesh1,0
      EntityAlpha BlurMesh2,0
      EntityAlpha BlurMesh3,0
   End If
End Function




Function FreeBlur()
   FreeTexture BlurTexture
   FreeEntity BlurMesh1
   FreeEntity BlurMesh2
   FreeEntity BlurMesh3
End Function




;######################## AB HIER NUR ZUR VERANSCHAULICHUNG ########>>>>
;######## DER CODE DADRÜBER KANN ALS INCLUDE BENUTZT WERDEN ########>>>>

Graphics3D 800,600,0,1
SetBuffer BackBuffer()

Local Timer=CreateTimer(60)
Local Camera=CreateCamera()
Local Light=CreateLight()
Local Tube=CreateCylinder(12)
Local Cube=CreateCube()
Local BlurPower#=1

CreateBlur(Camera) ;BLUR INITIALISIEREN

CameraClsColor Camera,164,164,72
TurnEntity Light,50,-50,0
ScaleEntity Tube,16,16,16
TurnEntity Tube,0,0,90
TurnEntity Cube,-30,0,0
MoveEntity Cube,0,-2,3
EntityColor Tube,255,0,0
EntityFX Tube,4
FlipMesh Tube

While Not KeyHit(1)
   If KeyDown(203) Then BlurPower=BlurPower-.025:If BlurPower<0 Then BlurPower=0
   If KeyDown(205) Then BlurPower=BlurPower+.025:If BlurPower>1 Then BlurPower=1
   TurnEntity Tube,0,.5,0
   TurnEntity Cube,0,.2,0
   
   UpdateBlur(Camera,BlurPower) ;BLUR ANWENDEN
   Text 20,20,"Cursor links/rechts"
   Text 20,40,"Blur-Stärke "+BlurPower
   WaitTimer(Timer)
   Flip 0
Wend

FreeBlur()
End

;<<<<####################### BIS HIER NUR ZUR VERANSCHAULICHUNG ########
;<<<<######## DER CODE DADRÜBER KANN ALS INCLUDE BENUTZT WERDEN ########

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 13, 2007 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@ich; ja, Fullspeedfähig sollte es sein. Auf meiner alten Kiste (komplett ~4 Jahre alt) geht es, wenn auch nicht ohne Recourceneinbusen. So ist ein Spiel, welches zuvor mit 120 FPS unterwegs war, nun mit Blur auf 80 FPS. In diesem Fall also -33% Recourcen weg. Blurlibrarys sind aber alle recht Recourcenverschwendent und sollten so auch immer mit bedacht eingesetzt werden.

@Silver_Knee; coole Sache, habe deine Verbesserung bei mir getestet und so auch bei mir jetzt eingebaut.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

The_Nici

BeitragDi, Nov 13, 2007 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Wende ich den Blur auf Hectic's 4WD-Buggy an, flimmert es ziemlich stark.

Ansonsten schöne Sache. Sehr nützlich!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Nov 13, 2007 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, was für ein Reinfall für mich. Workaround erstmal:

Code: [AUSKLAPPEN]
CameraRange camera,.5,3000


Weil im Abstand von 1 die Quads vor einem gesetzt sind. Da fällt mir auch wieder ein, was ich noch ändern wollte in der Blurlib.

Edit1: Neue Version 1.1 im obersten Codeabschnitt hinzugefügt. Vier neue Verbesserungen:

- Blur nun auch bei allen Bildschirmverhältnisen möglich (danke an Silver_Knee)
- Blur bei Volllast (also '=1') ist nun sowas wie trübsal, was man beim sterben anweden kann.
- CamerRange -Problem dadurch gelöst, dass sich nun die Quads mit Abstand von 100 befinden.
- Kleine Korrektur an den Seitenrändern rechts und unten gemacht.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

CaeSar

Betreff: Perfekt

BeitragMi, Nov 21, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Großes Lob Very Happy

kann man gut gebrauchen

mfg Cae$ar

Puccini

BeitragDi, Jan 15, 2008 11:47
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich verwend ja schon deine draw3d -routinen, und seit geraumer zeit suche ich eine gute funktionssamlung zu blur!
du hast mir damit jetzt ein haufen arbeit abgenommen Wink

nahezu mein gesamtes spiel besteht aus deinen code snippets ^^

Grosses Lob!

MfG Puccini
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Jan 15, 2008 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das freud mich zu hören. Wink
Beachte aber bitte, dass jede art von Blur sehr viel Recourcen braucht. Man sollte von daher im Spiel (oder was auch immer), dem User immer die Möglichkeit geben, dieses eben abzustellen. Denn es gibt ja auch noch User da draussen, die mit Notebooks oder recht alten Rechnern unterwegs sind.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Puccini

BeitragDi, Jan 15, 2008 15:45
Antworten mit Zitat
Benutzer-Profile anzeigen
ich programmier mein spiel auf meinem notebook Wink

und das mit dem Tests hab ich mir auch schon gedacht. hab einen 1ghz amd mit ner nvidia2 rumliegen ^^ wenns auf dem noch läuft läufts überall ^^

naja. das blur kommt nur zum einsatz wenn man gestürzt ist oder hard geschlagen wurde.

ausstellen soll natürlich auch gehen Wink

Aber ich sag mal, die demo die dabei is verbraucht bei mir grad mal 20%cpu.. da taktet der nich mal von seinen 800mhz hoch ^^ also so scheints schon super zu sein.
-=Achtung=-
Suche Hobby-Modelliere der hin und wieder bock hat ein kleines Objekt zu erstellen. Bei Interesse PM
www.ragesoft.de
Passwortmanager: http://ragesoft.de/index.php?o...;Itemid=39
 

GermannX

Betreff: Klasse!

BeitragDo, Okt 02, 2008 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich muss wirklich sagen, dass ist genial!
Nur hätte ich ein Frage: Warum flackert das bei mir so böse, wenn ich das in meinem Programm verwenden will? Wärend auf dem Screenshot oben an allen Seiten ein dunkler Rand ist, gibts den bei mir immer abwechselnd oben und links oder unten und rechts. Das kann man auf folgendem Screenshot gut erkennen: http://www.file-upload.net/vie...z.jpg.html

Warscheinlich irgend ein dämlicher Fehler von mir, aber ich weiss eben nicht welcher. Falls das schonmal jemandem passiert ist oder ne Idee hat, woran es liegen könnte, wäre es nett, wenn man mir mitteilen würde wie man das Problem löst. Smile

Danke im Vorraus

GermannX
...und der Tod warf seine Sense weg und stieg auf den Mähdrescher, denn es war Krieg!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Okt 02, 2008 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Blur hat zwei Konstanten die geändert werden können:

Code: [AUSKLAPPEN]
Const BLURWIDTH#=0.8
Const BLURDEPTH%=256


BLURWIDTH
... gibt an, wie stark die drei Quads ausseinander liegen. Je mehr, umso stärker fällt der Blureffekt aus ohne mehr Systemrecourcen zu benötigen. Allerdings ist die Voreinstellung von 0.8 bereits eine art Maximum die sinnvoll ist. Das hängt auch von der angewendeten Auflösung selbst ab.

- Versuche also zuerst BLURWIDTH wieder auf 0.8 oder gar weniger zu stellen.

- Noch nebenbei: Benutze keine festgelegten hohen Auflösungen (> 1024x768) mit einem Blur zusammen, ohne den User die Möglichkeit zu geben diesen Auschalten zu können, da es dann anfäng stark an den Recourcen zu fressen (Hängt sehr von der Grafikkarte ab). Auch tritt der Blureffekt auf größeren Auflösungen schwächer aus.

BLURDEPTH
... gibt an, wie groß die Blurtextur sein soll. Je größer, umso bessere Darstellungsqualität wird erreicht. Jedoch auch mehr Systemrecourcen werden benötigt. Sinnvolle Werte sind zum Beispiel 256 oder 512.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

ToeB

BeitragSa, Okt 04, 2008 10:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal sehr geil sowas such ich schon lange !

Jetzt wollt ich aber noch fragen, ob man auch z.b. nahe dinge an der Cam scharf sieht und weite verschwommen und umgekehrt so als ob man halt aus einem richtigen auge guckt ? Oder kann man das hiermit nicht realisieren ?

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

The_Nici

BeitragSa, Okt 04, 2008 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB, das wäre Depth of Field, und das ist wiederum aufwändiger.
Du könntest mehrmals pro Schleifendurchlauf Rendern und auf Sprites hauen, aber das zieht die Performance runter.

ToeB

BeitragSo, Okt 05, 2008 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
okay, aber kann ich diesen Blur auch in einer anderen Farbe malen, z.b. in Rot für wenn man getroffen ist und so weiter...

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Okt 05, 2008 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Über Parameter ist es direkt nicht vorgesehen, aber man kann sich ja ohne weiteres die nötigen Parameter selbst einbauen.

Als Beispiel in die CreateBlur -Funktion einfach mit hinein:

Code: [AUSKLAPPEN]
   EntityColor BlurMesh1,255,160,160
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group