begin process at 2010 02 10 08:31:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > EASY OPENGL: DE L'OPENGL DANS LA VCL

EASY OPENGL: DE L'OPENGL DANS LA VCL


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Classé sous :opengl, vcl Niveau :Initié Date de création :03/05/2006 Vu / téléchargé :4 831 / 663

Auteur : Forman

Ecrire un message privé
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce package permet de créer des composants visuels Delphi descendant de TWinControl avec un Canvas de type TGlCanvas et un contexte OpenGl associé créé automatiquement. Donc, fini les appels laborieux à wglCreateContext dès que la fenêtre est recréée par exemple, le composant le fait automatiquement.

En résumé, il est possible de créer une nouvelle famille de contrôles VCL descendant de TGLWinControl, qui utilisent OpenGl pour se dessiner.

Un exemple est fourni avec le package, qui montre entre autre comment utiliser la GlFont du GlCanvas (voir capture). Lors du lancement du programme, les fenêtres mettent quelques 10èmes de seconde à s'afficher, car la police OpenGl est générée en qualité maximale (pour l'instant, c'est l'option par défaut).

Le package contient 3 composants:
-TGlWinControl (l'équivalent d'une TPaintBox, mais en OpenGl). Il publie un événement OnPaint dans lequel le Canvas est automatiquement "locké", il suffit d'appeler les primitives OpenGl voulues pour dessiner à l'intérieur. De plus, ce contrôle peut tout à fait contenir des contrôles VCL standards non OpenGl (comme un TEdit par exemple)!
-TGlIntKnob : un bouton rond qui permet de définir un Integer entre 2 valeurs Min et Max. Il réagit aux flèches du clavier et à la molette de la souris, si on appuie sur Ctrl en même temps la variation est plus rapide.
-TGlFloatKnob: idem avec une valeur de type Double.

Les messages WM_PAINT sont traités automatiquement, et OpenGl est synchronisé avec GDI de façon à ce que l'application reste graphiquement homogène et pour éviter les clignotements. Pour dessiner sur un GlCanvas, il suffit d'appeler sa procédure Lock, appeler les primitives OpenGl correspondantes (glBegin, glVertex etc...) et au final ne pas oublier d'appeler la procédure UnLock du canvas, sinon l'application risque de se bloquer. Le tout est thread-safe (par l'intermédiaire d'un "thread local storage" qui garde en mémoire le canvas courant), c'est à dire qu'il est tout à fait possible de dessiner sur un Canvas depuis un autre thread, et même d'imbriquer les méthodes Lock et UnLock de plusieurs canvas différents.

La seule contrainte est que tout appel à la méthode Lock d'un canvas doit être suivi d'un appel à sa méthode UnLock dans le même thread, et l'imbrication des appels ne peut pas se "chevaucher". Par exemple:

    Canvas1.Lock;
    Canvas2.Lock
    ...
    Canvas2.UnLock;
    Canvas1.UnLock

est valide, mais

    Canvas1.Lock;
    Canvas2.Lock
    ...
    Canvas1.UnLock;
    Canvas2.UnLock

ne l'est pas.

Il y a de plus une détection automatique des erreurs OpenGl (GL_INVALID_ENUM et autres), et le dernier appel à la fonction UnLock d'un canvas appelle automatiquement SwapBuffers si le canvas est en DoubleBuffered. Ces exceptions OpenGl sont rejetées de façon à apparaitre uniquement lorsque Delphi est lancé lors de l'appel au PaintHandler de façon à éviter qu'elles apparaissent à l'exécution en dehors de Delphi.

De plus, tous les GlCanvas créés partagent automatiquement le même espace de listes, c'est à dire que les textures et listes créées avec un canvas peuvent s'utiliser avec tous les autres. Les canvas ont aussi une propriété Font (TGlFont) qui permet de dessiner du texte quasiment comme le TFont standard.

Lors des messages WM_PAINT, le Canvas est automatiquement "clippé" sur la zone à afficher du contrôle, en utilisant l'extension GL_WIN_swap_hint si disponible, sinon en utilisant GL_SCISSOR_TEST. Le viewport et la projection sont définis comme pour un contrôle VCL traditionnel (c'est à dire (0,0)=TopLeft, (ClientWidth,CLientHeight)=BottomRight).

Voilà, je crois que j'ai tout dit, c'est un peu technique mais je pense que si quelqu'un veut commencer à faire de l'OpenGl, ça peut être un bon FrameWork pour commencer facilement.

Source

  • TGlCanvas=class
  • function LoadExtension(Name:string;ProcNames:array of string;ProcAddresses:array of PPointer):Boolean; //Use to load non-standard gl extensions
  • procedure CreateContext(Handle:HWND;Format:TGlPixelFormat);virtual; //DO NOT CALL DIRECTLY (used internally)
  • procedure DestroyContext(Handle:HWND);virtual; //DO NOT CALL DIRECTLY (used internally)
  • property ColorBits:Byte read GetColorBits; //Actual color bits
  • property AlphaBits:Byte read GetAlphaBits; //Actual alpha bits
  • property DepthBits:Byte read GetDepthBits; //Actual depth bits
  • property StencilBits:Byte read GetStencilBits; //Actual stencil bits
  • property DoubleBuffered:Boolean read GetDoubleBuffered; //If actually double buffered
  • property SwapMethod:TGlSwapMethod read GetSwapMethod; //Actual swap method
  • property Font:TGlFont read FFont write SetFont; //GL font
  • procedure MakeViewPort(Rect:TRect;ClientHeight:Integer;ClipRect:PRect=nil;BorderWidth:Integer=0); //DO NOT CALL DIRECTLY (used internally)
  • procedure Lock; //Use before painting on the canvas
  • procedure Unlock; //MUST be called after each call to Lock
  • end;
  • TGlPixelFormat=class(TPersistent)
  • published
  • property DesiredAlphaBits:Byte read FDesiredAlphaBits write SetDesiredAlphaBits; //Desired alpha bits
  • property DesiredDepthBits:Byte read FDesiredDepthBits write SetDesiredDepthBits; //Desired depth bits
  • property DesiredStencilBits:Byte read FDesiredStencilBits write SetDesiredStencilBits; //Desired double buffer
  • property DoubleBuffered:Boolean read FDoubleBuffered write SetDoubleBuffered; //Desired stencil bits
  • property DesiredSwapMethod:TGlSwapMethod read FDesiredSwapMethod write SetDesiredSwapMethod; //Desired swap method (not all methods are supported by drivers)
  • end;
  • TGlFont=class
  • public
  • function GetName:PChar;
  • procedure SetName(Value:PChar);
  • property Name:PChar read GetName write SetName; //Like the usual TFont
  • function GetSize:Single;
  • procedure SetSize(Value:Single);
  • property Size:Single read GetSize write SetSize; //Like the usual TFont
  • function GetStyle:TFontStyles;
  • procedure SetStyle(Value:TFontStyles);
  • property Style:TFontStyles read GetStyle write SetStyle; //Like the usual TFont
  • function TextSize(Text:PChar):TSize; //Size of text (given the size of the font)
  • procedure TextOut(X,Y:Single;Text:PChar); //Draw text on current canvas
  • end;
  • TGlWinControl=class(TWinCOntrol)
  • public
  • constructor Create(AOwner:TComponent);override;
  • property Canvas:TGlCanvas read FCanvas write FCanvas;
  • destructor Destroy;override;
  • published
  • property OnPaint:TNotifyEvent read FOnPaint write SetOnPaint; //OnPaint event
  • property OnAfterCreateContext:TNotifyEvent read FOnAfterCreateContext write SetOnAfterCreateContext; //Called after Gl context has been created
  • property OnBeforeDeleteContext:TNotifyEvent read FOnBeforeDeleteContext write SetOnBeforeDeleteContext; //Called when Gl context is about to be destroyed
  • property PixelFormat:TGlPixelFormat read FPixelFormat write SetPixelFormat; //Desired pixel format (not all systems will provide requested values)
  • end;
  TGlCanvas=class
    function LoadExtension(Name:string;ProcNames:array of string;ProcAddresses:array of PPointer):Boolean;  //Use to load non-standard gl extensions

    procedure CreateContext(Handle:HWND;Format:TGlPixelFormat);virtual;    //DO NOT CALL DIRECTLY (used internally)
    procedure DestroyContext(Handle:HWND);virtual;                         //DO NOT CALL DIRECTLY (used internally)

    property ColorBits:Byte read GetColorBits;               //Actual color bits
    property AlphaBits:Byte read GetAlphaBits;               //Actual alpha bits
    property DepthBits:Byte read GetDepthBits;               //Actual depth bits
    property StencilBits:Byte read GetStencilBits;           //Actual stencil bits
    property DoubleBuffered:Boolean read GetDoubleBuffered;  //If actually double buffered
    property SwapMethod:TGlSwapMethod read GetSwapMethod;    //Actual swap method
    property Font:TGlFont read FFont write SetFont;          //GL font

    procedure MakeViewPort(Rect:TRect;ClientHeight:Integer;ClipRect:PRect=nil;BorderWidth:Integer=0);  //DO NOT CALL DIRECTLY (used internally)

    procedure Lock;       //Use before painting on the canvas
    procedure Unlock;     //MUST be called after each call to Lock
  end;

  TGlPixelFormat=class(TPersistent)
  published
    property DesiredAlphaBits:Byte read FDesiredAlphaBits write SetDesiredAlphaBits;               //Desired alpha bits
    property DesiredDepthBits:Byte read FDesiredDepthBits write SetDesiredDepthBits;               //Desired depth bits
    property DesiredStencilBits:Byte read FDesiredStencilBits write SetDesiredStencilBits;         //Desired double buffer
    property DoubleBuffered:Boolean read FDoubleBuffered write SetDoubleBuffered;                  //Desired stencil bits
    property DesiredSwapMethod:TGlSwapMethod read FDesiredSwapMethod write SetDesiredSwapMethod;   //Desired swap method (not all methods are supported by drivers)
  end;

  TGlFont=class
  public
    function GetName:PChar;
    procedure SetName(Value:PChar);
    property Name:PChar read GetName write SetName;              //Like the usual TFont

    function GetSize:Single;
    procedure SetSize(Value:Single);
    property Size:Single read GetSize write SetSize;             //Like the usual TFont

    function GetStyle:TFontStyles;
    procedure SetStyle(Value:TFontStyles);
    property Style:TFontStyles read GetStyle write SetStyle;     //Like the usual TFont

    function TextSize(Text:PChar):TSize;                         //Size of text (given the size of the font)
    procedure TextOut(X,Y:Single;Text:PChar);                    //Draw text on current canvas
end;

  TGlWinControl=class(TWinCOntrol)
  public
    constructor Create(AOwner:TComponent);override;

    property Canvas:TGlCanvas read FCanvas write FCanvas;

    destructor Destroy;override;
  published
    property OnPaint:TNotifyEvent read FOnPaint write SetOnPaint;                                            //OnPaint event

    property OnAfterCreateContext:TNotifyEvent read FOnAfterCreateContext write SetOnAfterCreateContext;     //Called after Gl context has been created
    property OnBeforeDeleteContext:TNotifyEvent read FOnBeforeDeleteContext write SetOnBeforeDeleteContext;  //Called when Gl context is about to be destroyed

    property PixelFormat:TGlPixelFormat read FPixelFormat write SetPixelFormat;                              //Desired pixel format (not all systems will provide requested values)
  end;

 Conclusion

Merci de me dire si vous trouvez des bugs.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip TRADUCTION DE DOKAN EN DELPHI: UN DRIVER "USER-MODE" POUR DI...
Source avec Zip Source avec une capture TASK MANAGER EN MODE TEXTE (ÉMULATION MODE 03H)
Source avec Zip Source avec une capture CHRONOMÈTRE POUR LE THÉ
Source avec Zip UTILITAIRE POUR LANCER UN PROGRAMME DEPUIS UN AUTRE COMPTE (...
Source avec Zip Source avec une capture DÉMONSTRATION DE LA GESTION DES OBJETS EN MÉMOIRE PAR DELPHI...

 Sources de la même categorie

Source avec Zip Source avec une capture TA TÊTE A SUBI UNE DÉFORMATION TEMPORELLE!!! par Forman
Source avec Zip Source avec une capture [GLSCENE] GLSTARS, UN CIEL ETOILÉ AVEC DES LENSFLARE ET POIN... par f0xi
Source avec Zip Source avec une capture GLTICKTICK (GLSCENE) ET TICKTICK, DEUX HORLOGE A AIGUILLES (... par f0xi
Source avec Zip Source avec une capture PONG3D : GLSCENE par Nicolas___
Source avec Zip GLBASES IL S'AGIT D'UNE UNITÉ FACILITANT LA PROGRAMMATION D'... par delphiriri

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GLIBWMI VCL COMPONENT LIBRARY 1.6B par Neftali
Source avec Zip Source avec une capture PACKAGE BORLAND par blueperfect
Source avec Zip Source avec une capture RUSH HOUR 3D AVEC OPENGL par Zeeman
Source avec Zip Source avec une capture MODELEUR DE PRIMITIVE par Zeeman
Source avec Zip Source avec une capture TA TÊTE A SUBI UNE DÉFORMATION TEMPORELLE!!! par Forman

Commentaires et avis

Commentaire de Forman le 04/05/2006 01:08:29

J'ai oublié de préciser: les TGlKnob sont entièrements dessinés en OpenGl!

Commentaire de shining le 08/05/2006 21:21:47

Salut,
plutôt sympas ce composant néanmoins ça ne marche pas sous D6, car la propriété "ParentBackground" n'existe pas dans TWinControl !!! or ce serait dommage de penaliser les utilisateurs d'une version antérieur de Delphi7 juste à cause d'une propriété

il faudra donc créer une liste des directives de Delphi et mettre par exemple :

  dans TGlWinControl en Published
  {$IFDEF DELPHI7UP}
  property ParentBackground;
  {$ENDIF}

et dans le code il faudra remplacer
      
procedure TGlWinControl.WMPaint(var Message: TWMPaint);
begin
    ....
      if not ParentBackground then
      begin
          with ColorToGlColor(Color) do
          glClearColor(R,G,B,A);
          glClear(GL_COLOR_BUFFER_BIT);
      end;
      
      par
      {$IFDEF DELPHI7UP}
      if not ParentBackground then
      {$ENDIF}
      begin
          with ColorToGlColor(Color) do
          glClearColor(R,G,B,A);
          glClear(GL_COLOR_BUFFER_BIT);
      end;
      
ainsi les utilisateurs de Delphi5 & 6(voir même D4) pourront aussi profiter du composant

autre chose.. il est préférable d'inclure les fichiers resources soit dans le fichier dpk(juste en dessous de {$R *.res}) soit dans le fichier xx.reg(encore plus simple) c'est plus propre que de les mettres dans les unités !!!
bon courage pour la suite !!
@+

Commentaire de Forman le 09/05/2006 11:16:32

Merci pour l'info pour D6, je modifierai dés que j'ai le temps.
Pour la resource du composant, c'est effectivement plus "propre" de la mettre dans ce qui n'est que lié au package, mais en même temps la rattacher à l'unité du composant permet une plus grande facilité de maintenance lorsqu'on fait passer l'unité dans un autre package, ça évite d'avoir à éditer la resource pour extraire le bitmap, et le mettre dans la resource du nouveau package. Ceci dit, un bitmap 24x24 en 16 couleurs, ça ne devrait pas trop surcharger les resources des applications!

La solution optimale serait peut-être de rajoutter une directive de compilation pour enlever la ligne si l'unité n'est pas compilée dans un package. Connais-tu une directive pour le faire? J'ai cherché sans succès jusque là...

Commentaire de shining le 09/05/2006 20:15:03

Salut,
je ne pense pas qu'il existe une telle directive néanmoins il est toujours possible de desactivé la ligne..., il suffit d'inclure un fichier *.inc et mettre par exemple:

fichier MonCompoDirective.inc
...
{$DEFINE ISPACKAGE} tout en sachant que la désactivation se fait avec juste un "."(point) avant le mot reservé "$"
{.$DEFINE ISPACKAGE} <== directive désactivé
...

et dans ton fichier pas

unit MonCompo.pas

{$I MonCompoDirective.inc}

....

{$IFNDEF ISPACKAGE}
{$R MonCompoResource.res}
{$ENDIF}

implementation

où sinon il faut avec la directive {$IFOPT ..}
@+

Commentaire de mounjetado le 29/08/2006 15:58:02

>>Forman,
ton package m'intéresse au plus haut point, mais peut-il s'utiliser sous Delphi 2005?
et si oui... comment on installe cette bébête?
chaque fois que j'ai voulu installer un package, j'ai eu des soucis!
merci d'avance

Commentaire de Forman le 29/08/2006 16:24:11

Je ne suis pas sûr que ça marche (je n'ai pas Delphi 2005) mais normallement il suffit d'ouvrir le fichier GlControls_D7.dpk avec Delphi, le compiler et quelque part il doit y avoir un bouton "installer". Pour Delphi7, il faut faire s'afficher le gestionnaire de projets, faire un click droit sur le nom du projet concerné, et choisir l'item "installer" dans le menu. Ca va ajoutter plusieurs composants dans la palette de Delphi (dont le TGlWinControl dont je te parlais) dans la page "OpenGl".

Commentaire de mounjetado le 30/08/2006 11:56:08

salut,
j'arrive bien à installer ton package, mais qd je lance ton exemple, D2005 me dit qu'il manque deux fichier .DCR (GLControls.dcr et GLKnobs.dcr).
et je ne les trouve mm pas dans ton package...
sinon, soit dit en passant, j'ai tenté d'installer GLScene mais ou bien je n'ai pas une version compatible ou bien il y a des erreurs qq part car je me fais jeter à la compil sur un {$include glscene.inc} pour cause de fichier introuvable alors que qu'il est ds le source. j'ai essayé en mettant la ligne en commentaire et il manque encore des dcu pour certaines unités...
bon, si tu peux me dire pour tes .DCR...
pour le reste, tu n'es pas obligé...
à bientôt

Commentaire de Forman le 30/08/2006 13:37:29

C'est bizarre, les 2 fichiers .DCR sont dans le zip...
As-tu vérifié que tu les avais extraits dans le répertoire du package?

Commentaire de Forman le 30/08/2006 13:44:58

Ah oui: si l'erreur persiste, supprimes les lignes: {$R GLControls.dcr} et {$R GLKnobs.dcr} qui sont dans GlControls.pas et GlKnobs.pas respectivement.

Commentaire de pop_eye_666 le 19/07/2007 11:30:37

Bonjour,

Cette source est forte intérréssante, mais y a t-il la possibilité d'élargir le texte sans augmenter sa hauteur ???

Commentaire de mounjetado le 19/07/2007 12:46:35

merci forman
dsl pour le retard à l'allumage...
j'ai mis ça dans mes sources préférés et je verrai ça plus tard.
j'ai désinstallé GLScene pour l'instant, car ce n'est pas ma priorité actuellement.
mais c'est toujours un plaisir d'apprendre en te lisant.
pour l'instant j'essaie de me familiariser avec UML... quand j'ai 5 minutes entre deux interventions sur le réseau du service. si j'avais que du XP, ça irai plus vite lol
en plus de ça mon programme déboussole sensiblement mon débogueur et je dois à chaque fois le relancer!
si si... je confirme! je suis le meilleur planteur de débogueur! mdr
à plus, camarade! ;-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Acceder à l'aide pour 1 nlle VCL sous Delphi [ par Leroy ] Bonjour Existe-il après l' ajout d'un nouveau paquet de composants une astuce pour que l'aide de ce dernier soit accessible sous delphi avec la classi Mon programme qui utilise opengl marche sous windows me, mais pas sous xp! [ par Forman ] Le titre est assez explicite: mon programme GlChute, que vous pouvez trouver dans les sources que j'ai mises en ligne sur ce site, utilise opengl et m Une image dans une scene OPENGL [ par Laskar ] Je cherche desesperement un exemple d'utilisation de la commande glDrawPixels d'OPENGL.... ou quelqu'un connait-il la manière de placer une image dans Une image dans une scene OpenGL [ par Laskar ] Je cherche desespérement un exemple de la commande glDrawPixels d'OpenGL. Le but est de placer une image dans le fond de mon viewport. J'utilise le co ecrire du texte avec opengl ? [ par waryx ] comment on fait pour afficher du texte sous opengl ?car j aitrouver un tuto en anglais de 315 ligne il y a pas plus simple ?merci bcp gomard@free.fr Textures avec OpenGl [ par Gimli ] J'aimerais savoir si il y a moyen d'appliquer des textures (en 2D ou en 3D) avec opengl sans l'instruction glBindTexture.merci de me répondre si vous Debutant en openGL (texture d'un cube) [ par Lennemi ] J'ai réussis a mettre une texture a mon cube et elle apparait mais lorsque je compile le programme, le .exe affiche le cube sans texture, quel est la Créer un .scr a partir d'une scene OpenGL [ par Lennemi ] J'ai un programme qui permet de créer des effets lumineux a partir du composant GLFireFxManager, j'aimerais lorsque je clique sur un bouton, que ca me OpenGL - Image [ par Lennemi ] J'aimerais savoir comment convertir un GLSceneViewer en image JPG et avoir possibilité de changer la qualité de l'image.J'ai trouver ceci :GLSceneView opengl et MIPMAP [ par Vin-s ] Bonjour à tous,J'utilise OpenGL depuis peu..... et un problème très con s'offre à moi: Cette ligne de "paramètrage" d'une texture est connue:glTexPara


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,356 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales