![]() |
Easy3DGL - Eine Bibliothek für OpenGL
Liste der Anhänge anzeigen (Anzahl: 2)
Guten Abend liebe DP,
Ich habe schon vor längerer Zeit eine eigene Bibliothek für OpenGL geschrieben, die darauf ausgelegt ist, den Umgang mit OpenGL so einfach wie möglich zu machen, ohne irgendwelche Komplexen Techniken zu nutzen, um das ganze möglichst simpel zu halten. Bisher hatte ich allerdings keine vollständige Dokumentation dafür geschrieben, was das Veröffentlichen relativ sinnlos gemacht hätte, doch da ich im Moment mehr als genug Zeit habe, hab ich mich mal hingesetzt und einen einfache Dokumentation für diese Bibliothek fertig gestellt. Ich weiß dass es auch andere Bibliotheken für OpenGL gibt (GlScene etc.), doch diese Bibliothek ist so simpel gehalten, dass man auch aus ihr lernen kann (der Quelltext liegt bei), und so den Einstieg in OpenGL vereinfacht. Feature-Liste: - Kameraführung per Maus ohne eigenen Quelltext - Simpel zu initialisieren: Nur eine Zeile Code benötigt - Viele simple geometrische Formen als Klasse gekapselt zur einfachen Bedienung (z.B.: Quader, Kugel, Würfel, Kegelstumpf u.v.m.) - Kamerasensitivität kann eingestellt werden - Klassen zum einfachen erstellen eines 3D-Hintergrundes - Unterstützung vieler verschiedener Materialien (Material-Liste muss noch hinzugefügt werden) Für einen kompletten Überblick der Features siehe beiliegende Dokumentation / Beispielprogramme Mit der Bibliothek kommen einige kleinere Beispielprogramme, die die verschiedenen Klassen einführen. Download: ![]() Ohne Beispiele: ![]() Falls jemand von euch Verbesserungsmöglichkeiten im Quelltext sieht (was ziemlich sicher der Fall sein wird ;)), postet sie einfach bitte hier, und ich werde sie in die Bibliothek mit aufnehmen. Ich hoffe die Bibliothek hilft einigen, Den Thread werd ich bald erweitern mit einer etwas detaillierteren Darstellung der Easy3DGL, das hier ist mehr so eine kleine Vorschau dessen was möglich ist ;) Danke schomal fürs Feedback und Grüße, Edlmann |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Hallo, erstrmal Danke für die geleistete Arbeit :thumb:
Kenn mich da nicht so aus mit OGL deswegen wollte ich mir das mal ein wenig genauer anschauen. Allerdings bekomm ich bei allen Bsp.Anwendungen eine Exception am start der Programme. Woran kann das liegen? Habe WinVista |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Liste der Anhänge anzeigen (Anzahl: 1)
Wollte es auch schnell testen, aber Umlaute im Quelltext mochte meine Delphi-Version garnicht. Ist D2009 Vorraussetzung? siehe unten...
ARB_multisample war bei mir auch nicht dabei, aber das hatte ich noch so gefunden... **** Ok, Umlaute einfach mal ersetzt und läuft... Beim Beenden Fehler in in EASY3DGL bei:
Delphi-Quellcode:
Listenindex überschreitet Maximum.
finalization
if AppHandle > 0 then FreeGL; Aber sieht trotzdem schon ganz gut aus: |
AW: Easy3DGL - Eine Bibliothek für OpenGL
@lbccaleb: habe ich spontan keine Idee, warum das so ist...Hast du die compilierten Programme ausgeführt oder selbst compiliert?
@Satty67: Ups, hätt dabeischreiben sollen dass ich das in D2007 geschrieben habe...werd vllt noch eine zweite Version für D7 und drunter fertig machen, oder kannst du einfach die Version mit den ersetzten Umlauten hochladen? Wäre super. Zur ARB_Multisample: Hab nur vergessen die aus den uses zu entfernen, ist gefixxt ;) Die AV beim Beenden kann ich nicht nachvollziehen...Bei welchem Programm trat das ganze denn auf? |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Habe die compilierten Programme aus dem Archiv ausgeführt!
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
War aber nur Würfel und Türkis, bin einfach jeder Fehlermeldung gefolgt und hab' ein ue draus gemacht. Der Fehler kam bei der SkyBox-Demo... |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Hallo
Habe mir gerade die Doku zum Sonnensystem angeschaut, für mich beeindruckend. Meine bisherigen Erfahrungen beschränken sich auf etwas GLScene und VRML. Was ich aber suchen würde wäre eine import und exportfunktionalität für 3D DXF dateien. (Oder ein anderes Format wrl, x3d, ....) . Ich würde gerne unsere Produkte im 3D zusammenstellen (Die Einzelkomponenten sind im 3D konstuiert) ==> Gibt es so etwas, ich bin doch nicht der erste mit diesem Problem. ==> Ich habe zwar gegoogled aber irgendwie komme ich nicht weiter. mfg Reinhold |
AW: Easy3DGL - Eine Bibliothek für OpenGL
@satty67: Okey schade, aber das krieg ich glaub ich grad noch selber hin, die paar Ü's umzuwandeln :P
Zu dem Fehler: Ich liebe es etwas zu programmieren, was dann bei anderen Fehler aufwirft die man nicht nachvollziehen kann...Ich habe ehrlich gesagt absolut keine Idee, wo da der Fehler liegen könnte...es gibt eigentlich nur 2 Listen, bei denen der Fehler auftreten könnte, und bei beiden tritt der Fehler bei mir nicht auf...Ich kann das ganze ja leider nicht auf der selben Maschine wie du testen, aber es wäre super wenn du den Fehler mal auf einen kleineren Bereich eingrenzen könntest (z.B. indem du um Teile der Prozedur FreeGL einen try except Block setzt), damit ich den Fehler beheben kann. @rweinzierl: Mit dem Import von irgendwelchen Datei-Formaten hab ich mich absolut noch nicht beschäftigt, für alle Projekte die ich bisher in OGL geschrieben habe brauchte ich eigentlich nur Texturen... |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
Delphi-Quellcode:
unit Easy3DGL;
[...] procedure FreeGL; [...] for x := 0 to SolidList.Count - 1 do begin if Assigned(SolidList[x]) then begin CItem := SolidList[x]; CItem.Free; end; end; for y := 0 to TransparentList.Count - 1 do begin if Assigned(SolidList[x]) then // <<< Hier begin CItem := TransparentList[x]; CItem.Free; end; end; |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Deshalb lagert man so etwas auch in eigene Routinen aus ;)
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Okey, das könnte der Fehler sein...Ja, ist wohl beim einbauen einer extra Liste für die Transparenten Objekte ein wenig zu viel über CopyPaste gelaufen...danke, werd ich sofort korrigieren ;)
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Wenn ich ein wenig Zeit die Tage hab, schaue ich mir das nochmal genauer an, kahm da im mom leider noch nicht zu. Werde es dann auch mal selber compilieren, und dann mal sehen wo er sich festhängt...
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
So, ich bin auch dabei, die Bibliothek mal anzutesten. Gleich mal 2 Sachen, die mir aufgefallen sind:
a) (optional) Dateinamen kann man als TFileName deklarieren, so erkennt man besser, dass da ein Dateiname reingehört und sonst nix anderes. TFileName ist auch nur ein Verweis auf String (mit anderem Namen), sodass nur die Aufrufe geändert werden müssten. b) Die erste Init-Prozedur ist meiner Meinung nach zu restriktiv. Du könntest anstelle von TForm auch TWinControl übergeben. Dieses hat auch alle benötigten Member und dann könnte man auch ein Panel automatisch als Zeichenfläche initialisieren. c) Eventuell noch eine Unterstützung von PNG als Texturen. Für TGA wäre es nett, einen Link auf ein Programm zu haben, welches das automatisch umwandelt (neben GIMP versteht sich). d) Und wo ich grad dabei bin: Eine Version ohne Beispiele um die alte Version einfach zu updaten. e) In der Prozedur "procedure GLSurface.AddHeightMap(MapFile: string);" ist ein größerer Fehler drin. Das TBitmap HMap wird erst NACH dem anfänglichen try erzeugt, nicht davor. f) Ist das eigentlich ein Problem der D7-Version oder erden Kegelstumpf und Zylinder tatsächlich nicht gezeichnet? - Dann solltest du dir eine inheitliche Methode ausdenken, wie du am besten die Objekte zeichnen könntest: Dein Grundobjekt (müsste GLObject sein) bekommt einfach eine Prozedur namens Draw mit dem Attribut virtual. Sieht dann so aus:
Delphi-Quellcode:
. Diese überschreibst du in allen abgeleiteten Klassen. dann musst du auch nicht in RenderWorld jedes deiner Objekte mit einem IS-Operator abfragen.
procedure Draw; virtual;
g) Bei mir kommt noch eine AV beim schließen des Programms in der Prozedur FreeGL an dieser Stelle:
Delphi-Quellcode:
Da ich deren Ursache nicht gefunden habe (und du wohl auch nicht, weil sonst kein Try-Except drum herum wäre), wäre es nett, wenn du die Ursache trotzdem finden würdest.
if Assigned(TransparentList[y]) then
begin CItem := TransparentList[y]; CItem.Free; end; h) Wenn kein OpenGL-fähiger Graphiktreiber installiert ist, was bei mir in der VM der Fall ist, dann quittieren alle Beispielprogramme mit einem großen Haufen von AVs den Dienst. Momentaner Workaround:
Delphi-Quellcode:
Ich versuche mal was besseres zu finden.
try
InitForm(Self); except Error('No OpenGL compatible Graphics Device/Driver found'); Halt; end; Bernhard |
AW: Easy3DGL - Eine Bibliothek für OpenGL
@rollstuhlfahrer: Erstmal ganz großes Dankeschön dass du die die Unit so ausführlich angeschaut hast und nach Fehlern gesucht hast ;) Ich werd die Liste mal durchgehen und schauen, ob und wie ich die einzelnen Punkte fixxen kann.
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Und eine Doku, wie man was dreht und was sich in Abhängigkeit mit dreht.
Kleines Beispiel: Ich habe ein Spielfeld, welches dem User präsentiert wird. Darauf befindet sich momentan 1 Spielstein, den man mit den Pfeiltasten bewegen kann. Ist das Spielfeld nicht gedreht geht alles. Sobald das Spielfeld gedreht wird, fängt das System an zu spinnen, heißt der Spielstein bewegt sich nicht mit einem Winkel von 0° zum Spielfeld. Noch ein Punkt zur Liste: Dein TGA-Loader und mein TGA-Bild aus GIMP wollen nicht zusammen kommen. Eventuell solltest du ne Exception mit schönen Fehlertext werfen, wenn ein Fehler im Bilder-Loader auftritt. PS: Und in
Delphi-Quellcode:
kann man auch etwas kürzen:
function TGLBMP.LoadImage(filename : String): Boolean;
Delphi-Quellcode:
const
ImageBMP = 0; ImageJPG = 1; ImageTGA = 2; case (AnsiIndexText(ExtractFileExt(filename), ['.bmp', '.jpg', '.png']) of ImageBMP: Result := LoadBMP(filename); ImageJPG: Result := LoadJPG(filename); ImageTGA: Result := LoadTGA(filename); end; PPS: a) Deine Bibliothek lädt übrgens die Texturen spiegelverkehrt auf die Körper. Workaround (dirty)
Delphi-Quellcode:
.
.Rotate(180, 0, 0)
b) Dein Code:
Delphi-Quellcode:
Mein Code:
AppEvents := TApplicationEvents.Create(AForm);
AppEvents.OnIdle := Kamera.Render;
Delphi-Quellcode:
(Die Unit Forms ist ja eh in der USES drin.)
Application.OnIdle := Kamera.Render;
Bernhard |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Bei mir fliegt die Exception bei:
Delphi-Quellcode:
Und FreeGL sollte auch nicht öfters aufgerufen werden.:shock:
wglSwapIntervalEXT(1);
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Hi alle,
egal welches Beispielprogramm ich starte --> Resultat: Access violation. Grüsse Rainer |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Beim Aktivieren von V-Sync also...werd ich mich mal schlau machen, ob das auf älteren Grakas zu Fehlern führt und wie man diese umgehen kann
@mleyen: Wieso wird FreeGL denn öfters aufgerufen? Das wir eigentlich nur bei der Finalisation aufgerufen, sonst nicht...o_o |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Ich hab das beim Sonnensystem gesehn.
Da wurds in FormDestroy() und in irgendeinem finalization-Abschnitt aufgerufen. |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
Bernhard ADD: Gibt es eigentlich eine Version, die aktueller ist, als die momentan verfügbare zum Download? |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Ich hab grade eine neue Version hochgeladen, wo ich beim Starten eines Programms die Fehlerbehandlung verbessert habe und eine andere Prozedur zum V-Sync aktivieren benutze, ich weiß aber nicht ob das den Fehler fixxt...
Zu deiner Liste rollstuhlfahrer: a) noch nicht erledigt, mach ich aber noch b) geht leider nicht, da bei TWinControl die Events OnMouseDown etc protected sind c) den Texturloader habe ich nicht selbst geschrieben, werd mich mal umschauen ob es einen Loader dafür gibt d) Hinzugefügt e) gefixxt f) War in beiden Versionen ein Fehler und ist gefixxt. Das mit der virtuellen Methode hatte ich auch versucht, allerdings wurde die Prozedur dann trotz override nicht korrekt aufgerufen... g) Den Fehler finde ich einfach nicht. Die AV kommt erst bei CItem.Free, und ich frage ja vorher extra ab ob da auch was ist was man befreien kann...ich versteh es bisher absolut nicht. h) Ist verbessert, kommt jetzt eine Fehlermeldung Zweiter Post: Es kann sein dass der das TGA nicht annimmt, weil es keine Farbtiefe von 32-bit hat. Der Texturloader den ich im Moment benutze unterstützt anscheinend aber nur 32-bittige-tga's a) liegt auch am Loader, schau ich mir mal an b) Hab ich verändert. @mleyen: Habs dann auch relativ schnell nach dem ich den Post oben geschrieben habe gesehen ^^ lag dran dass das Beispiel noch mit einer älteren Version geschrieben wurde, wo das nicht automatisch erledigt wurde. Ist gefixxt. Vielen Dank fürs Feedback ;) |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
Aber schau Dir mal die Schleife an... meine da war Schleifenvariable x und Zugriff über y (oder umgekehrt) |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Sehe ich anders...
Delphi-Quellcode:
Das auf SolidList geprüft wird statt TransparentList[], war zudem wohl der C&P Fehler
// FreeGL
for y := 0 to TransparentList.Count - 1 do begin if Assigned(SolidList[x]) then begin CItem := TransparentList[x]; CItem.Free; end; end; |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Mmh...bei mir steht da:
Delphi-Quellcode:
kann sein dass ich das schon gefixxt habe, und nur noch nicht hochgeladen, schau ich gleich mal
try
for x := SolidList.Count - 1 downto 0 do begin if Assigned(SolidList[x]) then begin CItem := SolidList[x]; SolidList.Remove(CItem); CItem.Destroy; end; end; for x := TransparentList.Count - 1 downto 0 do begin if Assigned(TransparentList[x]) then begin CItem := TransparentList[x]; TransparentList.Remove(CItem); CItem.Destroy; end; end; except end; |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Also ist bei mir natürlich noch die ungefixte Version, aber dachte darauf bezog sich die Liste von rollstuhlfahrer. Wenn es gefixt ist, ist ja gut.
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Sagen wir die CopyPaste Fehler sind gefixxt... die AV kommt noch immer... ^^
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Hab mir die neue Version noch nicht angeschaut, aber statt .Destroy sollte man lieber FreeAndNil() verwenden.
Und ein private-Sichtbarkeitsabschnitt wäre für Sachen wie FreeGL von Vorteil. |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab die AV gefunden: In der TransparentList ist an Position 1 (bei mir) ein schon aus dem Speicher genommenes Objekt, welches fälschlicherweise von Assigned als existent erachtet wird. Jetzt nur noch schauen, wo das Objekt gelöscht wird.
Bernhard ADD: AV entgültig gefunden: Bei mir wurde ein GLLicht erstellt. Dieses wurde zu der genannten Liste hinzugefügt. Leider wurde dieses Licht vorher bei den Lichtern aus dem Speicher genommen und ist somit nicht mehr da. Dann soll es allerdings wieder aus dem Speicher genommen werden und dann knallt der nächste Zugriff (das war bei mir die Abfrage nach dem Klassenname). ADD2: Was mir noch auffällt: Meine Objekte sind alle DOPPELT in der Liste, sie werden also auch 2x gezeichnet. Was machen die da doppelt drin? ADD3: Warum die alle doppelt drin sind? - Das liegt an den Konstuktoren: In GLQuader (Beispiel) wird das Material gesetzt. Dann wird über inherited der Konstruktor von GLObject aufgerufen und dort gleich nochmal das Material gesetzt. -> macht 2 Listeneinträge, von denen einer zu viel ist. ADD4: Ich habe mal eine geänderte Version hochgeladen (für Delphi ohne Umlaute). Alles, was ich geändert habe, habe ich mit "Änderung" versehen. Teilweise stehen auch die Gründe direkt dabei. |
AW: Easy3DGL - Eine Bibliothek für OpenGL
@rollstuhlfahrer: Vielen Dank für die Änderungen, die meisten davon sind sinnvoll und teilweise bügeln sie auch Fehler aus, die sich eingeschlichen haben als ich größere Sachen an der Unit verändert habe (z.B. bei GLSurface die noch deklarierte BitMap etc.).
Jetzt weiß ich auch warum das bei mir mit der virtuellen Methode nicht funktioniert hat, weil ich das abstract vergessen hatte... Nur bei einer Änderung bin ich der Meinung das sie überflüssig ist, nämlich bei der Prozedur FreeGL, dort hast du folgendes hinzugefügt:
Delphi-Quellcode:
Allerdings wird die Prozedur gar nicht aufgerufen, wenn AppHandle = 0 ist, aufgrund folgenden Codes:
procedure FreeGL;
if AppHandle = 0 then // Änderung! Exit;
Delphi-Quellcode:
finalization
if AppHandle > 0 then FreeGL; |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Das ist eine Sicherung gegen mehrfaches aufrufen, woher die Aufrufe auch immer kommen mögen. Ich finde sie sinnvoll, weil dadurch Fehler eliminietr werden, bevor sie auftreten. Alternativ könnte man auch eine Exception werfen, um dem Programierer zu sagen, dass diese Prozedur doch bitte nur 1x aufgerufen werden sollte.
Bernhard |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Die Prozedur muss ja in der aktuellen Version gar nicht mehr vom Programmierer aufgerufen werden, das übernimmt ja die Unit selber...aber ich lass es einfach mal drin, schadet ja auf der anderen Seite auch niemandem.
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Vielleicht kann ich auch meine Frage in einem separaten Thread aufmachen, aber es passt zu diesem Thema. Ich weiss auch, dass der letzte Beitrag ein Weilchen her ist. Ich bin mit der Klasse Easy3DGL beschäftigt. Auf dem Beispielprogramm von dem Sonnensystem aufbauend, erweitere ich Planeten um Planeten. Den Asteriodengürtel habe ich soweit auch eingebaut. Allerdings dabei, ist die Texture vom Jupiter nicht mehr sichtbar. Der Pfad zur Datei ist korrekt (auch wenn er momentan relativ ist, dies ändere ich später). Ich hänge euch mal einen Screenshot rein. Die roten Planeten sind Jupiter und Neptun, die im Speicher sind, aber nicht gezeichnet werden. Hier ist mein Code von der FormCreate:
Delphi-Quellcode:
Hat jemand eine Idee voran dies liegen kann, warum die Texture nicht (immer) geladen wird?
procedure TForm1.FormCreate(Sender: TObject);
var i : integer; begin Width := Screen.Width; Height := Screen.Height; Top := 0; Left := 0; InitForm(self); Sonne := GLKugel.Create(0,0,0,2,'textures/sun_darker.jpg'); Merkur := GLKugel.Create(2.5,0,0,0.1, 'textures/merkur.jpg'); Venus := GLKugel.Create(4,0,0,0.4, 'textures/venus.jpg'); Erde := GLKugel.Create(7,0,0,0.5, 'textures/earth.jpg'); Erde.SelfRotate(-70,0,0); Mond := GLKugel.Create(8.5,0,0,0.2, 'textures/moon.jpg'); Mars := GLKugel.Create(10,0,0,0.4,'textures/mars.jpg'); for i:= 1 to ASTERIODENANZAHL do begin Asteroidenguertel[i] := GLKugel.Create(15,0,0,0.1,'textures/asteriod.jpg'); Asteroidenguertel[i].Rotate(0,i,0); end; Jupiter := GLKugel.Create(20,0,0,1,'textures/jupiter.jpg'); Jupiter.SelfRotate(-90,0,0); Saturn := GLKugel.Create(25,0,0,0.8, 'textures/saturn.jpg'); Saturnring := GLZylinder.Create(25,0,0,0,2,''); Saturnring.SelfRotate(-85,0,0); Uranus := GLKugel.Create(28,0,0,0.6, 'textures/uranus.jpg'); Neptun := GLKugel.Create(32,0,0,0.6, 'textures/neptune.jpg'); SonnenLicht := GlLicht.Create(0,0,0); Sonne.SetSelfGlow(1,1,1); end; |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Nein, fällt mir Spontan leider nichts zu ein...außer dass es ein Fehler in der Textur sein könnte...
Wird der Planet den korrekt gerendert wenn du andere Dinge entfernst? Und wenn ja, welche? |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
Delphi-Quellcode:
in der Unit glBMP.pas.
function TGLBMP.LoadJPG(filename : String) : Boolean;
Trotzdem danke ;) |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
Teste das mal. PS: Obwohl so wie ich gerade sehe nur 32Bit unterstützt werden (JPG) ColorDepth := 32; gruss |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
|
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
PS: Oder Eigenschaft vom Bild (TAB Details) gruss |
AW: Easy3DGL - Eine Bibliothek für OpenGL
Zitat:
[Add]: Die Bittiefe des Bilder vom Jupiter ist 24bit sowie wie die anderen Planetenbilder auch. Die anderen werden dennoch dargestellt. Folgender Test habe ich auch gemacht: jupiter.jpg > jupiter.bmp mit 24bit > wird angezeigt. Hat jemand eine Erklärung dafür? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz