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 :

wxWidget 2.8 et la nouvelle façon d'utiliser Opengl


Sujet :

wxWidgets

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut wxWidget 2.8 et la nouvelle façon d'utiliser Opengl
    Bonjour,

    Depuis wxWidget 2.7.x et +, l'utilisation d'Opengl se fait en peu différement et j'esseye de l'utiliser mais je n'y arrive pas trop bien.

    Voici mon code:
    main.h :
    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
    #include <wx/wx.h>
    #include <wx/glcanvas.h>
     
    class myGLCanvas : public wxGLCanvas
    {
    	public:
    		myGLCanvas(wxFrame *);
     
    	private:
    		wxGLContext *glContext;
    		void onIdle(wxIdleEvent &);
    		DECLARE_EVENT_TABLE()
    };
     
    class myFrameMain : public wxFrame
    {
    	public:
    		myFrameMain();
     
    	private:
    		myGLCanvas *glCanvas;
    		wxGLContext *glContext;
    };
     
    class Ini : public wxApp
    {
    	public:
    		virtual bool OnInit();
    };
     
    DECLARE_APP(Ini);
    main.cpp :
    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
    //Compilation : g++ `wx-config --cxxflags` `wx-config --libs core,base --gl-libs` main.cpp
     
    #include "main.h"
    using namespace std;
     
    myFrameMain::myFrameMain() : wxFrame(NULL, -1, "test", wxPoint(-1, -1), wxSize(1024,790), wxDEFAULT_FRAME_STYLE)
    {
    	glCanvas = new myGLCanvas(this);
    	glContext = new wxGLContext(glCanvas);
    	wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
    	sizer->Add(glCanvas, 1, wxALL|wxEXPAND, 0);
     
    	this->SetSizer(sizer);
    }
     
    myGLCanvas::myGLCanvas(wxFrame *parent) : wxGLCanvas(parent, glContext, -1, wxPoint(0,0))
    {
    	this->glContext = glContext;
    	parent->Show();
    }
     
    void myGLCanvas::onIdle(wxIdleEvent &event)
    {
    	SetCurrent(*glContext);
    	//ou encore : glContext->SetCurrent(*this);
     
    	glClear(GL_COLOR_BUFFER_BIT);
    	glBegin(GL_TRIANGLES);         
    		glVertex2f(-0.9, -0.5);  
    		glVertex2f(-0.1, -0.5);
    		glVertex2f(-0.5, 0.5);
    	glEnd();
     
    	SwapBuffers();
    	event.RequestMore();
    }
     
    IMPLEMENT_APP(Ini);
    bool Ini::OnInit(void)
    {
    	myFrameMain *frame = new myFrameMain();
    	frame->Show(TRUE);
    	return true;
    }
     
    BEGIN_EVENT_TABLE(myGLCanvas, wxGLCanvas)
    	EVT_IDLE(myGLCanvas::onIdle)
    END_EVENT_TABLE()
    Dans la documentation ( http://www.wxwidgets.org/manuals/2.8...xglcanvas.html ), ils disent que l'ont peut utiliser soit wxGLCanvas::SetCurrent ou soit wxGLContext::SetCurrent (si j'ai bien compris leur phrase en anglais, lol)

    J'ai donc esseyé les 2 solutions et j'ai toujours une erreur de segmentation à cette ligne.

    Merci d'avance...

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    D'où vient le glContext dont tu te sers dans le constructeur de myGLCanvas ? D'ailleurs tu ne devrais pas chercher à en passer un au constructeur de ton wxGLCanvas, c'est seulement dans le cas où tu veux partager plusieurs contextes.

    Tu ne devrais pas non plus en créer un dans ta classe parent, et laisser simplement ton GLCanvas avoir le sien.

    ... A moins que tu n'aies plusieurs canavs OpenGL, dans ce cas oublie ce que j'ai dit.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    Merci pour ta réponse mais...

    Donc je doit utiliser le constructeur de wxGLCanvas qui ne demande pas un wxGLContext ?

    Donc comme ceci ?:
    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
    myGLCanvas::myGLCanvas(wxFrame *parent) : wxGLCanvas(parent, -1, wxPoint(0,0))
    {
    	glContext = new wxGLContext(this);
    }
     
    void myGLCanvas::onIdle(wxIdleEvent &event)
    {
    	SetCurrent(*glContext);
    	//glContext->SetCurrent(*this);
     
    	glClear(GL_COLOR_BUFFER_BIT);
    	glBegin(GL_TRIANGLES);         
    		glVertex2f(-0.9, -0.5);  
    		glVertex2f(-0.1, -0.5);
    		glVertex2f(-0.5, 0.5);
    	glEnd();
     
    	SwapBuffers();
    	event.RequestMore();
    }
    En tout cas ça fonctionne...mais je ne comprend pas bien ce que représente wxGLCanvas et wxGLContext.
    Qu'est ce que c'est un contexte ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un canvas OpenGL est un contrôle dans lequel on va pouvoir afficher une scène OpenGL. Ce qui va lui permettre d'afficher de l'OpenGL, c'est justement le contexte.

    Un contexte OpenGL est toujours attaché à une zone de rendu (ici un canvas, donc), il contient tout ce qu'il faut en interne pour pouvoir afficher une scène OpenGL : les états de rendu, les matrices courantes, les textures, ...

    Ton dernier code est correct, si ce n'est qu'il faut utiliser l'autre version du constructeur qui ne demande pas de contexte (celle qui prend un tableau d'attributs en paramètre) -- enfin relis la doc, moi j'ai juste regardé vite fait.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 230
    Points
    230
    Par défaut
    Ha oui tu as raison, il vaut mieux utiliser les 4ème constructeur, merci.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/08/2013, 11h46
  2. Réponses: 7
    Dernier message: 17/11/2011, 06h18
  3. Grimdi Animator,une nouvelle façon pour générer du javascript
    Par rcsoft dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 18/10/2011, 22h18
  4. nouvelle façon d'utiliser ADO.Net j'y arrive pas
    Par yohann007 dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/04/2007, 16h41

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