IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

OpenGl rendering dans une form créée dynamiquement


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut OpenGl rendering dans une form créée dynamiquement
    Bonjour,

    Je débute.

    J'ai une fiche VCL TRI.PAS/tri.dfm qui initialise et créé un rendu en opengl.

    Si je démarre un nouveau projet supprime la fiche par defaut et la remplace par cette fiche, pas de problème (le rendu ce produit).
    Par contre si je renomme la fiche par défaut form2 et que je créé dynamiquement* ma fiche form1 sensée contenir le rendu, là la fiche s'ouvre mais le rendu ne s'affiche pas.

    *form1 := tform1.Create(form2);form1.Show;

    Merci d'avance pour vos réponses.

    Pascal.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par hey_monkey Voir le message
    Bonjour,

    Je débute.

    J'ai une fiche VCL TRI.PAS/tri.dfm qui initialise et créé un rendu en opengl.

    Si je démarre un nouveau projet supprime la fiche par defaut et la remplace par cette fiche, pas de problème (le rendu ce produit).
    Par contre si je renomme la fiche par défaut form2 et que je créé dynamiquement* ma fiche form1 sensée contenir le rendu, là la fiche s'ouvre mais le rendu ne s'affiche pas.

    *form1 := tform1.Create(form2);form1.Show;

    Merci d'avance pour vos réponses.

    Pascal.
    sans le code d'initialisation c'est difficile à dire...
    voici ceci également
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut voici le code de la fiche TRI.PAS
    Citation Envoyé par Paul TOTH Voir le message
    sans le code d'initialisation c'est difficile à dire...
    voici ceci également
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    unit Tri;
     
    interface
     
    uses
      OpenGL, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, ComCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        RadioButton1: TRadioButton;
        procedure FormCreate(Sender: TObject);
        procedure FormPaint(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        procedure Draw; //Draws an OpenGL scene on request
      public
      end;
     
    var
      Form1: TForm1;
      angle:single;
     
    implementation
     
    {$R *.DFM}
     
    procedure setupPixelFormat(DC:HDC);
    const
       pfd:TPIXELFORMATDESCRIPTOR = (
            nSize:sizeof(TPIXELFORMATDESCRIPTOR);	// size
            nVersion:1;			// version
            dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
                    PFD_DOUBLEBUFFER;	// support double-buffering
            iPixelType:PFD_TYPE_RGBA;	// color type
            cColorBits:24;			// preferred color depth
            cRedBits:0; cRedShift:0;	// color bits (ignored)
            cGreenBits:0;  cGreenShift:0;
            cBlueBits:0; cBlueShift:0;
            cAlphaBits:0;  cAlphaShift:0;   // no alpha buffer
            cAccumBits: 0;
            cAccumRedBits: 0;  		// no accumulation buffer,
            cAccumGreenBits: 10;     	// accum bits (ignored)
            cAccumBlueBits: 0;
            cAccumAlphaBits: 0;
            cDepthBits:16;			// depth buffer
            cStencilBits:0;			// no stencil buffer
            cAuxBuffers:0;			// no auxiliary buffers
            iLayerType:PFD_MAIN_PLANE;  	// main layer
       bReserved: 0;
       dwLayerMask: 0;
       dwVisibleMask: 0;
       dwDamageMask: 0;                    // no layer, visible, damage masks
       );
    var pixelFormat:integer;
    begin
       pixelFormat := ChoosePixelFormat(DC, @pfd);
       if (pixelFormat = 0) then
            exit;
       if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then
            exit;
    end;
     
    procedure GLInit;
    const
       light0_position:TGLArrayf4=( -8.0, 8.0, -16.0, 0.0);
       ambient:  TGLArrayf4=( 0.3, 0.3, 0.3, 0.3);
    begin
       // set viewing projection
       glMatrixMode(GL_PROJECTION);
       glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);
       // position viewer */
       glMatrixMode(GL_MODELVIEW);
       glEnable(GL_DEPTH_TEST);
     
       // set lights
       glEnable(GL_LIGHTING);
       glLightfv(GL_LIGHT0, GL_POSITION, @light0_position);
       glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient);
       glEnable(GL_LIGHT0);
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var DC:HDC;
        RC:HGLRC;
        i:integer;
    begin
       DC:=GetDC(Handle);        //Actually, you can use any windowed control here
       SetupPixelFormat(DC);
       RC:=wglCreateContext(DC); //makes OpenGL window out of DC
       wglMakeCurrent(DC, RC);   //makes OpenGL window active
       GLInit;                   //initialize OpenGL
    end;
     
    function getNormal(p1,p2,p3:TGLArrayf3):TGLArrayf3;
    var a,b:TGLArrayf3;
    begin
       //make two vectors
       a[0]:=p2[0]-p1[0]; a[1]:=p2[1]-p1[1]; a[2]:=p2[2]-p1[2];
       b[0]:=p3[0]-p1[0]; b[1]:=p3[1]-p1[1]; b[2]:=p3[2]-p1[2];
       //calculate cross-product
       result[0]:=a[1]*b[2]-a[2]*b[1];
       result[1]:=a[2]*b[0]-a[0]*b[2];
       result[2]:=a[0]*b[1]-a[1]*b[0];
    end;
     
    procedure TForm1.Draw;
    const D=1.5;
          H1=D/1.732;
          H2=D*1.732-H1; // D/H = tg(30) = 1/sqrt(3)
          HY=3.0;
    const //vertexes
          a1:TGLArrayf3=(-D, 0, -H1);
          a2:TGLArrayf3=(D, 0, -H1);
          a3:TGLArrayf3=(0, 0, H2);
          a4:TGLArrayf3=(0, HY, 0);
    var   n1, n2, n3, n4: TGLArrayf3;   //normals
    begin
     
       n1 := getNormal(a1,a3,a2);
       n2 := getNormal(a1,a2,a4);
       n3 := getNormal(a2,a3,a4);
       n4 := getNormal(a3,a1,a4);
       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
       glEnable(GL_NORMALIZE);
       glShadeModel(GL_FLAT);
       glCullFace(GL_BACK);
       glLoadIdentity;
       glTranslatef(0.0, 0.0, -12.0);
       glRotatef(angle, 0.0, 1.0, 0.0);
       glBegin(GL_TRIANGLES);
       glNormal3fv(@n1);
       glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a3);
       glNormal3fv(@n2);
       glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a4);
       glNormal3fv(@n3);
       glVertex3fv(@a2); glVertex3fv(@a3); glVertex3fv(@a4);
       glNormal3fv(@n4);
       glVertex3fv(@a3); glVertex3fv(@a1); glVertex3fv(@a4);
       glEnd;
       SwapBuffers(wglGetCurrentDC);
    end;
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
       Draw;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      angle:=angle+1.0;
      if (radiobutton1.Checked=true) then
        radiobutton1.Checked:=false
      else
        radiobutton1.Checked:=true;
      Draw;
    end;
    end.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Ton code semble inspiré de OpenGL with Delphi by Alexei Semichastny

    juste pour info

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (radiobutton1.Checked=true) then
        radiobutton1.Checked:=false
      else
        radiobutton1.Checked:=true;
    cela peut s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    radiobutton1.Checked := not radiobutton1.Checked;
    Vu ton utilisation, tu auras du prendre une CheckBox !

    Evite les Exit aussi, ce n'est pas très élégant (l'exemple sur l'EDN est vilain d'ailleurs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
       pixelFormat := ChoosePixelFormat(DC, @pfd);
       if (pixelFormat = 0) then
            exit;
       if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then
            exit;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    begin
      pixelFormat := ChoosePixelFormat(DC, @pfd);
      if pixelFormat <> 0 then
        SetPixelFormat(DC, pixelFormat, @pfd)
    end;
    Le Code s'execute sans rien produire ou il ne s'execute pas ?
    Tu entre bien dans le OnPaint ?

    Tu devrais controller les valeurs de retour de wglCreateContext et wglMakeCurrent

    Essaye de créer ta fenêtre dans le DPR sans l'afficher !
    Peut-être que certaines fonctions ne supportent pas d'être lancé APRES Application.Run()

    essaye aussi de forcer le style de la fenêtre possible qu'une option de la MainForm améliore le comportement de OpenGL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.CreateParams(var Params: TCreateParams); // override;
    begin
     inherited CreateParams(Params);
      Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
      Params.WndParent := GetDesktopwindow;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Double création de la Form?
    Citation Envoyé par ShaiLeTroll Voir le message
    Ton code semble inspiré de OpenGL with Delphi by Alexei Semichastny

    juste pour info

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (radiobutton1.Checked=true) then
        radiobutton1.Checked:=false
      else
        radiobutton1.Checked:=true;
    cela peut s'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    radiobutton1.Checked := not radiobutton1.Checked;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.CreateParams(var Params: TCreateParams); // override;
    begin
     inherited CreateParams(Params);
      Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
      Params.WndParent := GetDesktopwindow;
    end;
    Merci pour les conseils!
    La radiobox c'était juste pour checker son affichage, mais merci pour l'ecriture condensée.
    Tout le code du fichier TRI.pas vient d'un tutorial.

    Grace à ton aiguillage, j'ai remarqué que cela fonctionnais en supprimant la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TMainForm, MainForm);
      //Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Je ne comprend pourquoi cette ligne était présente là, ai-je mal ajouté la fiche VCL au projet?

    Merci.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Toute TForm ajoutée ou créée s'ajoute automatiquement dans le DPR, voir dans les Options de Projets, Fiches, Fiches Disponibles ...

    Tu devais avoir DEUX Form1 !
    Une créée par CreateForm, et une seconde par ton .Create()
    C'est le handle de la Première qui était fourni à OpenGL
    Possible que lors du second Create, cela ne faisait pas grand chose et concervait le Handle de la Première !
    Il est fort possible que la première Form1 n'était pas affiché (Visible restant à False)
    Et seule la seconde Form1 étant visible (via ton Show())
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Parcourir les elements d'une ligne crée dynamiquement dans un FORM
    Par redabadache3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2008, 14h30
  2. Réponses: 5
    Dernier message: 20/09/2007, 17h53
  3. Réponses: 5
    Dernier message: 07/08/2007, 10h10
  4. Réponses: 8
    Dernier message: 17/05/2007, 19h29
  5. [Excel] Charger une form créée dynamiquement dans un autre classeur
    Par spileo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/02/2007, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo