Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

OpenGL + GLUT Tworzenie wielu okien, obiektowo

Ostatnio zmodyfikowano 2017-01-08 17:15
Autor Wiadomość
Nazgul
Temat założony przez niniejszego użytkownika
OpenGL + GLUT Tworzenie wielu okien, obiektowo
» 2017-01-06 23:59:29
Dzień dobry,
mam problem z przesłaniem wskaźnika na metodę klasy.
Ma to działać mniej więcej w taki sposób.

C/C++
Window::Window()
{
    glutReshapeFunc( this->resize );
    glutDisplayFunc( this->display );
    glutIdleFunc( this->idle );
    glutKeyboardFunc( this->keyDown );
    glutKeyboardUpFunc( this->keyUp );
    glutSpecialFunc( this->skeyDown );
    glutSpecialUpFunc( this->skeyUp );
    glutMouseFunc( this->mouseClick );
    glutMouseWheelFunc( this->mouseWheel );
    glutMotionFunc( this->mouseMotion );
    glutPassiveMotionFunc( this->mouseMotion );
   
}

Próbowałem już to zmontować z szablonami(template <Window* w> ... nie wiedziałem jeszcze że to tak nie działa;P), z zapisaniem gdzieś wskaźnika na obsługiwany obiekt, funktorami itd. (Dobrze, bo wiele się nauczyłem;P , jednak rozwiązania nie znalazłem)

Ma ktoś pomysł na rozwiązanie tego problemu?
P-156145
Gibas11
» 2017-01-07 00:19:21
Wstaw tam lambdy przechwytujące this.
glutReshapeFunc([ this ]( /* parametry */ ) ) { this->resize( /* tu też */ ); } );

//edit: Możesz też użyć
std::bind
.
glutReshapeFunc( std::bind( & Window::resize, * this, std::placeholders::_1 /* itd. */ );

Ps. Kod pisany od ręki, więc mogą być jakieś drobne błędy.
P-156148
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-07 00:21:44
Wstępnie mi się udało, jednak nie jestem dumny z tego rozwiązania, jakby ktoś umiał to zrobić 'zgrabniej' to byłoby super;P

C/C++
Window::Window()
{
    static Window * window = this;
   
    glutReshapeFunc([]( int w, int h )->void { window->resize( w, h ); } );
    glutDisplayFunc([]()->void { window->display(); } );
    glutIdleFunc([]()->void { window->idle(); } );
    glutKeyboardFunc([]( unsigned char key_, int x_, int y_ )->void { window->keyDown( key_, x_, y_ ); } );
    glutKeyboardUpFunc([]( unsigned char key_, int x_, int y_ )->void { window->keyUp( key_, x_, y_ ); } );
    glutSpecialFunc([]( int key_, int x_, int y_ )->void { window->skeyDown( key_, x_, y_ ); } );
    glutSpecialUpFunc([]( int key_, int x_, int y_ )->void { window->skeyUp( key_, x_, y_ ); } );
    glutMouseFunc([]( int button_, int state_, int x_, int y_ )->void { window->mouseClick( button_, state_, x_, y_ ); } );
    glutMouseWheelFunc([]( int button_, int dir_, int x_, int y_ )->void { window->mouseWheel( button_, dir_, x_, y_ ); } );
    glutMotionFunc([]( int x_, int y_ )->void { window->mouseMotion( x_, y_ ); } );
    glutPassiveMotionFunc([]( int x_, int y_ )->void { window->mouseMotion( x_, y_ ); } );
}
P-156149
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-07 00:22:46
oooo w tym samym momencie, ale dzięki;P
P.S. faktycznie z tym przechwytywaniem [this], nie będzie tego brzydkiego static
P-156150
mokrowski
» 2017-01-07 00:54:08
Tu masz dobrą bibliotekę która rozwiązywanie takich problemów wspiera https://www.codeproject.com​/Articles/13287/Fast-C-Delegate. Bo Boost.SIgnal2 nie ma co uruchamiać dla takiego problemu.
P-156153
Monika90
» 2017-01-07 11:55:38
Bez zmiennej globalnej lub statycznej nie da się tego zrobić. Jedyne rozsądne wyjście - nie używać GLUTa.
P-156160
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-07 16:55:52
mmm patent z lambdą nie zadziałał. Okna się otwierają i długo dochodziłem do odpowiedzi czemu program nie działa poprawnie.. ten wskaźnik statyczny który wykorzystywałem w lambdach jak otwierałem pierwsze okno miało wskaźnik do pierwszego okna, potem jak drugie okno otwierałem to miało wskaźnik do drugiego, ale jak się okazało te lambdy co miał obsługiwać pierwsze okno również zmieniły swój wskaźnik na drugie okno przez co w dwóch oknach pojawiało się dokładnie to samo.. przechwytywanie [this] też nie działa, bo jest problem z konwertowaniem lambdy[]blabla na wskaźnik funkcji..

Dzięki Mokrowski za pomysł, jednak zawieranie coraz większej ilości bibliotek nie jest zbyt dobrą praktyką, potem są problemy z optymalizacją itp. także chciałbym to zrobić wykorzystując standard c++, mimo wszystko pięknie dziękuję, przeczytałem o funkcjonalności biblioteki i bardzo prawdopodobne, że kiedyś się przyda;)

Monika90, mógłbym Cię prosić o zaproponowanie czegoś innego zamiast GLUT'a, najlepiej jakby było obiektowe i jakby był jakiś prosty kurs w języku polskim, żeby ogarnąć podstawy, potem to już bez problemu na angielskich mogę jechać(jak tego kursu po polsku nie ma to też jakoś przeżyję;) ) i no zależy mi, żeby działało na wielu platformach
P-156174
Nazgul
Temat założony przez niniejszego użytkownika
» 2017-01-07 18:01:01
Okej, znalazłem GLFW3, nic jeszcze o niej nie wiem, także zostawię temat jeszcze chwilę otwarty, żeby ktoś mógł skrytykować;)
Wszystkim bardzo dziękuję za pomoc;)
P-156178
« 1 » 2
  Strona 1 z 2 Następna strona