Difference between revisions of "ZenGL Tutorial"

From Lazarus wiki
m (index)
m (Text replace - "delphi>" to "syntaxhighlight>")
Line 17: Line 17:
 
Go to "''Project > Project Options''". In "''Compiler Options > Paths''" you must add those in "''Other Unit Files''":
 
Go to "''Project > Project Options''". In "''Compiler Options > Paths''" you must add those in "''Other Unit Files''":
  
<delphi>headers
+
<syntaxhighlight>headers
 
extra
 
extra
 
src
 
src
Line 24: Line 24:
 
lib\msvcrt\$(TargetCPU)
 
lib\msvcrt\$(TargetCPU)
 
lib\ogg\$(TargetCPU)-$(TargetOS)
 
lib\ogg\$(TargetCPU)-$(TargetOS)
lib\zlib\$(TargetCPU)-$(TargetOS)</delphi>   
+
lib\zlib\$(TargetCPU)-$(TargetOS)</syntaxhighlight>   
  
 
== Compilation ==
 
== Compilation ==
Line 38: Line 38:
 
Also static compilation requires to follow the terms of [[LGPL]]-license, particularly you must open source code of application that use source code of ZenGL.
 
Also static compilation requires to follow the terms of [[LGPL]]-license, particularly you must open source code of application that use source code of ZenGL.
  
<delphi>{$DEFINE STATIC}</delphi>
+
<syntaxhighlight>{$DEFINE STATIC}</syntaxhighlight>
  
 
=== ZenGL using so/dll/dylib ===
 
=== ZenGL using so/dll/dylib ===
Line 44: Line 44:
 
Using so/dll/dylib doesn't require to open source code of your application. For this comment the ''$DEFINE STATIC''. Also you need to compile ZenGL library.
 
Using so/dll/dylib doesn't require to open source code of your application. For this comment the ''$DEFINE STATIC''. Also you need to compile ZenGL library.
  
<delphi>//{$DEFINE STATIC}</delphi>
+
<syntaxhighlight>//{$DEFINE STATIC}</syntaxhighlight>
  
 
==== Windows dll ====
 
==== Windows dll ====
Line 65: Line 65:
  
 
Program title, add resources:
 
Program title, add resources:
<delphi>program demo01;
+
<syntaxhighlight>program demo01;
  
{$R *.res}</delphi>
+
{$R *.res}</syntaxhighlight>
  
 
Define compilation mode (comment to use so/dll/dylib):
 
Define compilation mode (comment to use so/dll/dylib):
<delphi>{$DEFINE STATIC}</delphi>
+
<syntaxhighlight>{$DEFINE STATIC}</syntaxhighlight>
  
 
This add the ZenGL units.
 
This add the ZenGL units.
<delphi>uses
+
<syntaxhighlight>uses
 
   {$IFNDEF STATIC}
 
   {$IFNDEF STATIC}
 
   zglHeader
 
   zglHeader
Line 83: Line 83:
 
   zgl_utils
 
   zgl_utils
 
   {$ENDIF}
 
   {$ENDIF}
   ;</delphi>
+
   ;</syntaxhighlight>
  
 
Variables like in a standard pascal program:
 
Variables like in a standard pascal program:
<delphi>
+
<syntaxhighlight>
 
var
 
var
 
   DirApp  : String;
 
   DirApp  : String;
   DirHome : String;</delphi>
+
   DirHome : String;</syntaxhighlight>
  
 
Procedures to add code:
 
Procedures to add code:
<delphi>procedure Init;
+
<syntaxhighlight>procedure Init;
 
begin
 
begin
 
   // Here can be loading of main resources.
 
   // Here can be loading of main resources.
Line 116: Line 116:
 
begin
 
begin
 
  //
 
  //
end;</delphi>
+
end;</syntaxhighlight>
  
 
Here start the program:
 
Here start the program:
<delphi>Begin
+
<syntaxhighlight>Begin
 
   {$IFNDEF STATIC}
 
   {$IFNDEF STATIC}
 
   zglLoad( libZenGL );
 
   zglLoad( libZenGL );
Line 155: Line 155:
 
   // Initialize ZenGL.
 
   // Initialize ZenGL.
 
   zgl_Init();
 
   zgl_Init();
End.</delphi>   
+
End.</syntaxhighlight>   
  
 
=== Resulting Code ===
 
=== Resulting Code ===
  
 
The result is a ''template'' for ZenGL projects:
 
The result is a ''template'' for ZenGL projects:
<delphi>program template;
+
<syntaxhighlight>program template;
  
 
{$DEFINE STATIC}
 
{$DEFINE STATIC}
Line 218: Line 218:
 
   scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
 
   scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
 
   zgl_Init();
 
   zgl_Init();
End.</delphi>
+
End.</syntaxhighlight>
  
  
 
[[Category:Graphics]]
 
[[Category:Graphics]]

Revision as of 16:13, 24 March 2012

Deutsch (de) English (en) español (es) français (fr) русский (ru)


ZenGL | Tutorial 1 | Tutorial 2 | Tutorial 3 | Edit

Download

You can get ZenGL for Linux, Windows & Mac. Download ZenGL.

Installation

Just extract the downloaded file with a compressed files manager, like 7-Zip in the folder you want.

Source Path

Before using the modules don't forget to set path to source code of ZenGL.

Go to "Project > Project Options". In "Compiler Options > Paths" you must add those in "Other Unit Files":

headers
extra
src
src\Direct3D
lib\jpeg\$(TargetCPU)-$(TargetOS)
lib\msvcrt\$(TargetCPU)
lib\ogg\$(TargetCPU)-$(TargetOS)
lib\zlib\$(TargetCPU)-$(TargetOS)

Compilation

Application can be compiled with ZenGL statically or with using so/dll/dylib.

Read more about compilation in the ZenGL Wiki.

ZenGL statically

Advantage of static compilation is smaller size of application, but it requires including all units.

Also static compilation requires to follow the terms of LGPL-license, particularly you must open source code of application that use source code of ZenGL.

{$DEFINE STATIC}

ZenGL using so/dll/dylib

Using so/dll/dylib doesn't require to open source code of your application. For this comment the $DEFINE STATIC. Also you need to compile ZenGL library.

//{$DEFINE STATIC}

Windows dll

Open "src\Lazarus\ZenGL.lpi" then go to "Run > Compile (Ctrl + F9)".

Then in the directory "src\" you can see the file "ZenGL.dll", copy and paste in the folder "bin\i386" where all demo binaries are compiled. You always must copy libraries in your program output directory if you are using dll.

Now you can compile demos commenting the $DEFINE STATIC.

Other dll files in "bin\" folder you can use are: chipmunk.dll ; libogg-0.dll ; libvorbis-0.dll ; libvorbis-3.dll

First Program

This is the first demo program included with ZenGL, first create a new "Free Pascal Program". Add the Source Path as described before.

Also you must change the Syntax Mode in Project > Project Options > Compiler Options > Parsing to Delphi (-Mdelphi).

Remember, if you are using so/dll/dylib copy the library binaries to the output folder of your program.

Program title, add resources:

program demo01;

{$R *.res}

Define compilation mode (comment to use so/dll/dylib):

{$DEFINE STATIC}

This add the ZenGL units.

uses
  {$IFNDEF STATIC}
  zglHeader
  {$ELSE}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_utils
  {$ENDIF}
  ;

Variables like in a standard pascal program:

var
  DirApp  : String;
  DirHome : String;

Procedures to add code:

procedure Init;
begin
  // Here can be loading of main resources.
end;

procedure Draw;
begin
  // Here "draw" anything.
end;

procedure Update( dt : Double );
begin
  // This function is the best way to implement smooth moving of something, because timers are restricted by FPS.
end;

procedure Timer;
begin
  // Caption will show the frames per second.
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;

procedure Quit;
begin
 //
end;

Here start the program:

Begin
  {$IFNDEF STATIC}
  zglLoad( libZenGL );
  {$ENDIF}
  // For loading/creating your own options/profiles/etc. you can get path to user home
  // directory, or to executable file(not works for GNU/Linux).
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );

  // Create a timer with interval 1000ms.
  timer_Add( @Timer, 1000 );

  // Register the procedure, that will be executed after ZenGL initialization.
  zgl_Reg( SYS_LOAD, @Init );
  // Register the render procedure.
  zgl_Reg( SYS_DRAW, @Draw );
  // Register the procedure, that will get delta time between the frames.
  zgl_Reg( SYS_UPDATE, @Update );
  // Register the procedure, that will be executed after ZenGL shutdown.
  zgl_Reg( SYS_EXIT, @Quit );
  
  // Enable using of UTF-8, because this unit saved in UTF-8 encoding and here used
  // string variables.
  zgl_Enable( APP_USE_UTF8 );

  // Set the caption of the window.
  wnd_SetCaption( '01 - Initialization' );

  // Allow to show the mouse cursor.
  wnd_ShowCursor( TRUE );

  // Set screen options.
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );

  // Initialize ZenGL.
  zgl_Init();
End.

Resulting Code

The result is a template for ZenGL projects:

program template;

{$DEFINE STATIC}

{$R *.res}

uses
  {$IFNDEF STATIC}
  zglHeader
  {$ELSE}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_utils
  {$ENDIF}
  ;

var
  DirApp  : String; DirHome : String;

procedure Init;
begin
end;

procedure Draw;
begin
end;

procedure Update( dt : Double );
begin
end;

procedure Timer;
begin
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;

procedure Quit;
begin
end;

Begin
  {$IFNDEF STATIC}
  zglLoad( libZenGL );
  {$ENDIF}
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );
  timer_Add( @Timer, 1000 );
  zgl_Reg( SYS_LOAD, @Init );
  zgl_Reg( SYS_DRAW, @Draw );
  zgl_Reg( SYS_UPDATE, @Update );
  zgl_Reg( SYS_EXIT, @Quit );
  zgl_Enable( APP_USE_UTF8 );
  wnd_SetCaption( '01 - Initialization' );
  wnd_ShowCursor( TRUE );
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
  zgl_Init();
End.