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

wxWidgets Discussion :

wxWidgets Opengl Linux


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut wxWidgets Opengl Linux
    Bonjour,

    J'ai fait un programme avec wxWidgets et Opengl qui affiche un cube. Le programme fonctionne très bien sur Windows mais pas sur Linux

    Je ne sais vraiment pas où poster vu que je ne sais pas d'où vient le problème : Linux, WxWidgets ou Opengl ?! Donc je poste ici

    Sur Linux, le programme m'affiche une fenetre avec un fond gris (ou une fenetre qui semble vide si vous préférez)

    D'après quelques tests que j'ai fait:
    -L'openGL fonctionne sur mon linux (j'arrive à lancer Blender et le programme de test de ATI : fgl_glxgears)
    -La fonction OnIdle est bien éxécuté en permanence (voir code en-dessous)
    -Dans la fonction OnSize : height et width contiennent les bonnes valeurs.

    Voici le code:
    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
    #include "main.h"
     
    myFrameMain::myFrameMain() : wxFrame(NULL, -1, "Hello GL World", wxPoint(-1, -1), wxSize(1024,790), wxDEFAULT_FRAME_STYLE)
     
    {
    	glCanvas = new myGLCanvas(this);
    	wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
    	sizer->Add(glCanvas, 1, wxALL|wxEXPAND, 0);
     
    	this->SetSizer(sizer);
    	this->SetAutoLayout(true);
    	this->Layout();
    	this->ShowFullScreen(false);
    }
     
    myGLCanvas::myGLCanvas(wxWindow *parent) : wxGLCanvas(parent, -1, wxPoint(0,0))
    {
    	this->parent=(wxFrame*)parent;
    	fullScreen=false;
     
    	glShadeModel(GL_SMOOTH);
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0f);
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
    	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     
    	this->SetCurrent();
    }
     
    void myGLCanvas::onIdle(wxIdleEvent &event)
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    	glTranslatef(0.0f,0.0f,-6.0f);
     
    	GLubyte indices[]={
    		4, 5, 6, 7, //front
    		1, 2, 6, 5, //right
    		0, 1, 5, 4, //bottom
    		0, 3, 2, 1, //back
    		0, 4, 7, 3, //left
    		2, 3, 7, 6, //top		
    	};
     
    	const GLfloat sommets[]={
    		-1.0, -1.0, -1.0,	//0
    		1.0, -1.0, -1.0, 	//1
    		1.0, 1.0, -1.0, 	//2
    		-1.0, 1.0, -1.0, 	//3
    		-1.0, -1.0, 1.0,	//4
    		1.0, -1.0, 1.0,		//5
    		1.0, 1.0, 1.0,		//6
    		-1.0, 1.0, 1.0,		//7		
    	};
     
    	glEnableClientState(GL_VERTEX_ARRAY);
    	glVertexPointer(3, GL_FLOAT, 0, sommets);
     
    	glEnable(GL_CULL_FACE);
    	glCullFace(GL_BACK);
     
    	glColor3f(0.0f,1.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[0]);
    	glColor3f(1.0f,0.5f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[4]);
    	glColor3f(1.0f,0.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[8]);
    	glColor3f(1.0f,1.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[12]);
    	glColor3f(0.0f,0.0f,1.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[16]);
    	glColor3f(1.0f,0.0f,1.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[20]);
     
    	glFlush();
    	this->SwapBuffers();
    	event.RequestMore();
    }
     
    void myGLCanvas::onKey(wxKeyEvent &event)
    {
    	int key = event.GetKeyCode();
     
    	if(key==WXK_ESCAPE)
    	{
    		parent->Destroy();
    	}else if (key==WXK_F1)
    	{
    		fullScreen=!fullScreen;
    		parent->ShowFullScreen(fullScreen);
    	}
    }
     
    void myGLCanvas::onSize(wxSizeEvent &event)
    {
    	this->Layout();
    	this->GetSize(&width, &height);
    	glViewport(0, 0, width, height);
     
    	glMatrixMode(GL_PROJECTION);	
    	glLoadIdentity();
     
    	gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    	glMatrixMode(GL_MODELVIEW);
    }
     
    BEGIN_EVENT_TABLE(myGLCanvas, wxGLCanvas)
    	EVT_KEY_DOWN(myGLCanvas::onKey)
    	EVT_IDLE(myGLCanvas::onIdle)
    	EVT_SIZE(myGLCanvas::onSize)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(Ini);
     
    bool Ini::OnInit()
    {
    	myFrameMain *frame = new myFrameMain();
    	frame->Show(TRUE);
     
    	return true;
    }
    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
    #ifndef WXRAD_MAIN_H
    #define WXRAD_MAIN_H
     
    #include <math.h>
    #include <stdio.h>
     
    #include <wx/wx.h>
    #include <wx/glcanvas.h>
     
    class Ini : public wxApp
    {
    	public:
    		virtual bool OnInit();
    };
     
    class myGLCanvas : public wxGLCanvas
    {
    	public:
    		myGLCanvas(wxWindow *);
    		void onIdle(wxIdleEvent &);
    		void onKey(wxKeyEvent &);
    		void onSize(wxSizeEvent &);
    	private:
    		bool fullScreen;
    		wxFrame *parent;
    		int width, height;
    	protected:
    		DECLARE_EVENT_TABLE()
    };
     
    class myFrameMain : public wxFrame
    {
    	public:
    		myFrameMain();
    	private:
    		myGLCanvas *glCanvas;
    };
     
    DECLARE_APP(Ini);
     
    #endif
    Merci...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Re,

    J'ai rajouté "this->SetCurrent();" au début de la fonction "onIdle" et j'ai eu le droit à un écran noir

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Re 2,

    J'ai trouvé quelques différences entre Windows et Linux dans l'ordre d'éxécution des fonctions lors du démarrage du programme:

    Sur Windows:
    1) Il éxécute "glCanvas = new myGLCanvas(this);"
    2) Ensuite il exécute le constructeur de myGLCanvas
    3) Il éxecute la fonction onSize
    4) Il achève l'éxécution du constructeur myFrameMain
    5) Et pour finir il éxécute la fonction onIdle

    Sur Linux:
    1) Il éxécute "glCanvas = new myGLCanvas(this);"
    2) Ensuite il exécute le constructeur de myGLCanvas
    3) Il achève l'éxécution du constructeur myFrameMain
    4) Il éxecute la fonction onSize
    5) Il éxecute à nouveau la fonction onSize !
    6) Et pour finir il éxécute la fonction onIdle

    - Si je modifie la taille de la fenetre mon cube s'affiche correctement sur Linux.
    - Si j'ajoute se code au début de onIdle, la cube s'affiche :
    "wxSizeEvent var;
    this->onSize(var);" (mais ce n'est pas très propre je trouve)

    Pourquoi tant de différence et comment faire un programme compatible Windows/Linux ?

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Pourquoi tant de différence et comment faire un programme compatible Windows/Linux ?
    Les diffrences s'expliquent par plusieurs fait:
    - Les architecture des OS n'est pas la même
    - Les versions de wxWidgets ne sont pas maintenus par les mêmes personnes, par conséquent l'ordre des opérations n'est peut être pas le même.

    Sous mac, j'ai les mêmes problèmes (ça ne sont pas des problèmes mais des fonctionnalités différentes, le tout est de le savoir).

    Il faut absolument que tu précises SetCurrent au début de ta fonction d'affichage (c'est décrit dans la doc et sur le wiki) Sinon, tu auras des problèmes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci de ta réponse.

    Oui j'ai bien rajouter setCurrent() au début de ma fonction d'affichage mais je ne voie toujours pas mon cube tourner...

    Pour voir mon cube tourner je doit soit changer la taille de la fenetre ou mettre ceci dans ma fonction d'affichage (onIdle):
    wxSizeEvent var;
    this->onSize(var);

    Pas très beau et pas performant dutout : quelqu'un aurait une meilleur solution ?

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Et bien , en fait, il faut que tu crées et que tu places ta fenêtre de vue dès le début de ta fonction d'affichage. (en fait, c'est ton appel à onSize ), car sinon, ta fenêtre n'est pas affichée comme il faut, elle n'a pas de paramètre d'affichage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creer une fenetre opengl linux sans lib externe
    Par maitrelame2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 31/12/2007, 14h37
  2. installer wxWidget sur Linux
    Par [Hugo] dans le forum Linux
    Réponses: 7
    Dernier message: 27/10/2007, 11h58
  3. wxWidget + OpenGL
    Par shenron666 dans le forum OpenGL
    Réponses: 2
    Dernier message: 23/02/2006, 17h40
  4. ATI+OPENGL+LINUX = :evilred:
    Par vincho dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/01/2006, 15h09
  5. Commencer l'openGL??? (Linux)
    Par kacedda dans le forum OpenGL
    Réponses: 7
    Dernier message: 03/06/2005, 09h46

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