Autor Beitrag
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.09.04 09:27 
So... ich stelle jetzt endlich mal meine GameDev Komponenten online, da ich zu der Erkenntnis gekommen bin, dass ich doch auf längere Sicht nicht mehr dazu komme, daran weiter zu arbeiten oder meine Homepage zu launchen.
Den Anfang mache ich mit GLInterface.

Vorweg... ja ich hab gelesen, dass die Unit eigentlich komplett hier stehen müsste, aber leider ist sie RIESIG und zweitens bekommt ihr sonst die Komponentenicons nicht, die ich gemacht habe. Auch das mit dem "nur eine Unit pro Post" weiß ich, aber die Units gehören halt zusammen. Wenns wirklich ein Problem ist, soll mich ein Admin drauf ansprechen, dann sehen wir, was wir machen können.

-------------------------------------------------------------------------------------------------------------------

Da ich öfter mal kleine Programme mit OpenGL geschrieben habe, aber weder jedes mal alles neucoden wollte, noch so Sachen wie DelphiGL benutzen, die dafür viel zu kompliziert sind und ich lieber direkt mit den Originalbefehlen arbeite, hab ich mir dann einfach mal mein eigenes Interface geschrieben.

-> Sobald die Komponente installiert ist (hoffe ihr wisst, wie das geht), könnt ihr unter dem Reiter OpenGL zwei neue Komponenten auswählen: GLOutBox und GL2DOutBox. Die müsst ihr nur aufziehen wie z.B. ein Panel und schon ist euer OpenGL Fenster inklusive Projektionsmatrix fertig. Jetzt nur noch z.B. ins OnInitialize Event z.B. die Anfangskameraposition oder sonstwas reinschreiben, ins OnRender Event das was eben gemacht werden soll, vielleicht noch ein paar Einstellungen setzen (siehe unten) und dann in einer Endlosschleife oder mit Timer regelmäßig Repaint aufrufen.
Und das beste: Ihr braucht die OpenGL.pas oder ähnliches auch nicht mehr, denn in GLInterface ist ein header gleich integriert, der zwar nicht alle, aber eigentlich alle Befehle enthält, die man für ein Programm braucht!
Ich denke, dass ist auch ideal für Anfänger, die mal OGL probieren wollen, aber sich nicht mit dem ganzen Initialisierungsmüss rumschlagen wollen.

ehome.compuserve.de/...eDev/GLInterface.zip

Zu Demozwecken will ich hier gerade mal ein Programm dazustellen, dass u.a. mit GLInterface gemacht wurde:
ehome.compuserve.de/...meDev/OpenGLTest.zip
user defined image

--------------------------------------------------------------------------------------------------------------

Ich denke, ich stelle jetzt einfach mal die Komponenten vor indem ich Auszüge aus den Units poste...
(Beschreibungen sind auf Englisch, da ich auch Freunde in Übersee habe, mit denen ich mich manchmal über das Zeug unterhalte. Hoffe, das ist kein zu großes Problem)

GLInterface.pas:
ausblenden volle Höhe Delphi-Quelltext
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:
TGLOutBox = class(TWinControl) 
   [...]
  public
   property  Initialized:Boolean read FInitialized; // Is there an RC present?... Test to see if you can make calls to OGL functions
   function  Activate:Boolean; // If you're using multible Boxes and you're rendering outside the OnRender Event, use this to activate specific RCs (returns true if success)
   procedure Deactivate; // Might be used to block rendering, but no real need to call it
   procedure BeginFormatChange; // If you want to make several changes to Buffers (ColorDepth,Z,etc) at once, this will temporally block the recreation of the window
   procedure EndFormatChange;
   procedure Clear; // Clears the screen with ClearColor (see also 'AutoClear')
   procedure Swap;  // Swaps Front- and Backbuffer (for rendering outside of 'OnRender')
   function  ExtensionSupported(const Extension:String):Boolean; //Test if an arbitrary extension is found in GL- or WGL extensions
   constructor Create(AOwner: TComponent); override;
   destructor  Destroy; override;
  published
   property Align;
   property Anchors;
   property Cursor;
   property Visible;
   property Ctl3D;
   property ClearColor:TColor read FClearColor write SetClearColor default clBlack; // Assign a TColor to glClearColor
   property DrawColor:TColor read FDrawColor write SetDrawColor default clWhite; // Assign a TColor to glColor3ubv (!fast!)
   property GLDoubleBuffered:Boolean read FDoubleBuffered write SetGLDoubleBuffered default True; // !!Change destroys RC (therefore also textures and settings)!!
   property GLAntialiasing:Boolean read FAntiAliasing write SetAntiAliasing default False; // => GL_POINT_SMOOTH/GL_LINE_SMOOTH/GL_POLYGON_SMOOTH
   property GLColorDepth:byte read CurrPFD.cColorBits write SetColorDepth default 32// !!Change destroys RC!!
   property GLZBuffer:byte read CurrPFD.cDepthBits write SetZBuffer default 24// !!Change destroys RC!! ("0" automaticalls sets GL_DEPTH_TEST disabled, else it is enabled with GL_LEQUAL set) (!!some combinations with DoubleBuffered and ColorDepth are invalid on many systems!!)
   property GLStencilBuffer:byte read CurrPFD.cStencilBits write SetStencilBuffer default 0// !!Change destroys RC!! (!! 32Bit ZBuffer actually means 24Bit ZBuffer + 8Bit StencilBuffer!!)
   property HwAcceleration:Boolean read GetAcceleration; // Is there hardware acceleration available?
   property AutoClear:Boolean read FAutoClear write FAutoClear default True; // If True, 'Clear' is called before 'OnRender'
   property GLVSync:Boolean read FVSync write SetVSync default True; // Not necessarily available on all Systems
   property GLPerspViewAngle:Double read FViewAngle write SetViewAngle; // The angle of view from the eye position (for an undistorted view use 45°, might be used for zooming though')
   property GLClipFar:Double read FClipFar write SetClipFar; //Nothing beyond this distance from the camera will be rendered (!!very high values mess with your ZBuffer precision!!)
   property GLClipNear:Double read FClipNear write SetClipNear; //Nothing closer to the camera will be rendered (!!very small values mess with your ZBuffer precision!!)
   property GLBackCulling:Boolean read FCullFace write SetCulling default False; // Skip faces (polys) which face away from the camera (can speed up the rendering of closed shapes)
   property OnResize; // The perspective is automatically kept, so there is no real need to use this (see also: 'OnProjMatrixNeeded')
   property OnRender:TMethodCall read FOnRender write FOnRender; // Best put all your rendering code in here and then just use 'invalidate' (automatically locks drawing area, activates RC, clears screen, renders, flushes and swaps - everything within a try..finally block)
   property OnInitialize:TMethodCall read FOnInitialize write FOnInitialize; // Is always called after a new RC is created (initiate camera position or load textures here, as it won't work under 'Form.Create')
   property OnProjMatrixNeeded:TMethodCall read FOnProjMatrixNeeded write FOnProjMatrixNeeded; // If this is defined, ViewAngle/ClipNear/ClipFar are ignored and this is called instead after creation/resize (glViewPort is still called though)
 end;

GLOutBox erzeugt ein OGL Fenster mit den oben gesetzen Optionen, mit einer Projektionsmatrix (nach GLClipNear,GLClipFar,GlPerspViewAngle). Wenn Repaint aufgerufen wird, löscht es ggf selbständig den Buffer, ruft OnRender in einem try..finally Block auf und ruft dann ggf glSwap auf. In OnRender muss also wirklich nur das rein, was auch gerendert werden soll.

GL2DOutBox macht prinzipiell dasselbe, aber erstellt eine 2D orthogonale Matrix, d.h. alle Vektorangaben beziehen sich zukünftig direkt auf Pixel im Fenster [0,0]=links unten)

Den Rest findet ihr hoffentlich selber raus. Sonst halt hier Fragen...

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
TGLBitmapFont = class(TComponent)
  [...] 
  public
   procedure BeginWrite3D(ZBufferIgnore:Boolean = False); // You must call this before printing into 3D-space (if parameter is false, text may be covered by closer objects in 3D-space)
   procedure EndWrite3D;                                  // Call this after printing into 3D-space
   procedure BeginWrite2D; // You must call this before printing onto the Screen (Coordinates will be mapped to Pixels with lower left as 0,0 - on a TGL2DOutBox you may also call BeginWrite3D for the same effect)
   procedure EndWrite2D;   // Call this after printing onto the Screen
   procedure TextOut(const AText:String; X,Y,Z:Single); // Print a text (coordinate will be the lower left corner of the text)
   constructor Create(AOwner:TComponent); override;
   constructor CreateRunTime(const GLWindow:TGLOutBox; const Font:TFontName; Size:Byte; Bold,Italic,Underlined:Boolean); //pretty self-explanatory (don't forget to call Free when no longer needed)
   destructor  Destroy; override;
  published
   property OutputComponent:TGLOutBox read FOutputComponent write FOutputComponent; // If not specified, the first TGLOutBox created will be used
   property Font:TFontName read FFont write FFont;                  // -|
   property Size:Byte read FSize write FSize;                       //  |
   property XBold:Boolean read FBold write FBold;                   //  |> These can only be modified at DesignTime!! Every BitmapFont can hold only one font - use multiple BitmapFonts if required
   property XItalic:Boolean read FItalic write FItalic;             //  |
   property XUnderlined:Boolean read FUnderlined write FUnderlined; // -|
 end;

Da es ja das übliche Problem ist, in OGL Text auszugeben, wie auf einem Canvas, hab ich gleich noch die Komponente hier dazugetan. Damit könnt ihr ein BitmapFont erstellen und im OGL fenster ausgeben.

GLTextures.pas
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
TGLTextureLoader = class(TComponent)
  [...]
  public                                             
   function LoadFromFile(const Source:String):Cardinal;
   function LoadFromScreen(X,Y,Width,Height:Integer):Cardinal;
   function GeneratePlainRGB(Width,Height:Integer):Cardinal;
   function GeneratePlainRGBA(Width,Height:Integer):Cardinal;
   procedure CopyScreen(X,Y,Width,Height:Integer; RGBDest:Cardinal);
   procedure SetPriority(Tex:Cardinal; NewPriority:Single);
   procedure Unload(Tex:Cardinal);
   constructor Create(AOwner:TComponent); override;
   destructor  Destroy; override;
  published
   property TextureFilter:TTexFilterType read FFilter write SetFilter default tfBilinear;
   property BuildMipMaps:Boolean read FMipMap write SetMipMap default False;
   property Tiling:Boolean read FTiling write FTiling default True;
   property MemPriority:Single read FPriority write FPriority;
 end;

Texturen braucht man natürlich auch für OpenGl, weswegen ich den Textureloader hier gebastelt habe. Der Ladecode für JPG und TGA stammt nicht von mir aus einer anderen bekannten unit, die ich aber momentan nicht mehr wiederfinde. (muss ich irgendwann nochmal dazusetzen).
Ist eigentlich für jemanden, der sich mit OpenGl schon ein Bisschen auskennt recht selbsterklärend. Die Properties müssen vor dem Laden gesetzt werden und gelten dann jeweils für die geladene Textur.

GLEffects.pas
Die Unit müsst ihr euch selber angucken. Ich fand's im Nachhinein eher eine dumme Idee, die zu schreiben. Darin kapsele ich Lichter und Nebel in Komponenten.

GLOut2D.pas
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure glRectangle(const Client:T2DBox; Opaque:Boolean=False);
 procedure glPolygon(const Client:TPolygon; Opaque:Boolean=False);
 procedure glLine(const AStart,AEnd:TVector2f); overload;
 procedure glLine(const ALine:TLineSegment); overload;
 procedure glArrow(const AStart,AEnd:TVector2f; HeadSize:Single);
 procedure glPoint(const Destination:TVector2f; Size:Single);
 procedure glCircle(const Center:TVector2f; Radius:Single; Opaque:Boolean=False); overload;
 procedure glCircle(const ACircle:T2DCircle; Opaque:Boolean=False); overload;
 procedure glCircle64(const ACircle:T2DCircle; Opaque:Boolean=False);
 procedure glCircle32(const ACircle:T2DCircle; Opaque:Boolean=False);

In den nächsten Tagen wird auch meine Unit Geometry2D herauskommen. Mit dieser kleinen Befehlssammlung kann man die darin enthaltenen Formen direkt ausgeben, was ja sonst bei OGL immer etwas kompliziert wird.

So... ich glaube, das reicht erstmal...
Viel Spass!
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.09.04 21:53 
Also ein wenig mehr Rückmeldung hatte ich mir dann eigentlich schon erhofft.

Kann mir vielleicht jemand sagen, wo ich meine Komponenten "richtig" veröffentlichen kann?
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Do 30.09.04 22:35 
erstmal nen respekt an dich hast dir da viel mühe mit gemacht, hab mir nur die demo und die pas-dateien angeschaut :) kannst es denk ich mal am besten bei torry.net uppen da schauen immer viele vorbei...
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 01.10.04 14:55 
warscheinlich sind die meisten noch zu besgeistert was :D zu schrieben. ich selber bin auch grad schin fleissig am rendern. echt n super ding die unit ! RESCHPEKT

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Brainiac
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 01.10.04 21:53 
Ah :lol:
Na dann is ja schön... ich dachte schon, das ließt hier überhaupt keiner.

Also wenn das so ist, dann stelle ich morgend die Komponenten für DirectSound3D und DirectInput und meine Geometry2D.pas hier dazu.

Wenn ich dann längere Zeit kein negatives Feedback bekomme, dann werd isch's wohl mal bei Torry probieren.
Mit der eigenen Homepage das nehme ich dann irgendwann nochmal in Angriff.

Übrigens... Wenn ihr mir was von dem schickt oder hier postet, was ihr mit der Komponente gemacht habt, würd ich mich auch freuen.
Und wenn ihr anderen davon erzählt, dann sowieso. :wink:

Grüße!