NSOpenGLView: Abfrage des Viewports liefert keine Werte

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSOpenGLView: Abfrage des Viewports liefert keine Werte

    Schönen guten Morgen.

    Ich habe hier ein kleines Problem und verstehe nicht was ich falsch gemacht habe :huh:

    Ich nutze die NSOpenGLView. Während das Fenster auf den Bildschirm gepackt wird, werden ja die 2 Methoden dieser Klasse aufgerufen: "prepareOpenGL" und "reshape". In der reshape-Methode setzte ich den Viewport mit "glViewport()" und frage diesen anschließend direkt ab mit "glGetIntegerv(GL_VIEWPORT, &intArray)". Soweit so gut, alles funktioniert korrekt.

    Nun möchte ich z.B. in der "mouseMove-Mehtode" herausfinden, über welchem Objekt (über welcher Textur) sich die Maus befindet. Das mache ich mit der "gluProject()"-Funktion, welche unter anderem die Viewport-Werte als Parameter verlangt. Frage ich jetzt hier die Viewport-Werte mit "glGetIntegerv(GL_VIEWPORT, &intArray)" ab, so wird das Array nicht beschrieben und bleibt mit den initialisierten Werten gefüllt.

    Ich verändere nun die Fenstergröße, die "reshape"-Methode der NSOpenGLView wird erneut aufgerufen und der Viewport wird ja erneut gesetzt. Die dierekte Ausgabe danach sagt mir, dass auch hier alles korrekt abläuft.

    Führe ich jetzt die Prozedur in der "mouseMove"-Methode durch, so funktioniert es einwandfrei. Was habe ich hier vergessen oder falsch gemacht? Warum bekomme ich die Viewport-Werte in meiner "mouseMove"-Methode erst dann, wenn sich das Frame der NSOpenGLView verändert hat? ?(

    Vielen Dank im Voraus...
  • Der Viewport ändert sich nur wenn du das Fenster änderst (ist ja klar).
    Du willst Picking?

    in der drawRect


    Quellcode

    1. //Picking
    2. glGetDoublev(GL_MODELVIEW_MATRIX, _lastModelMatrix);
    3. glGetDoublev(GL_PROJECTION_MATRIX, _lastProjMatrix);
    4. glGetIntegerv(GL_VIEWPORT, _lastViewport);




    mouseDown


    Quellcode

    1. _lastMousePoint = [self convertPoint:[event locationInWindow] fromView:nil];
    2. // Nearplane
    3. gluUnProject(_lastMousePoint.x, _lastMousePoint.y, 0.0, _lastModelMatrix, _lastProjMatrix, _lastViewport, &x1, &y1, &z1);
    4. // Farplane
    5. gluUnProject(_lastMousePoint.x, _lastMousePoint.y, 1.0, _lastModelMatrix, _lastProjMatrix, _lastViewport, &x2, &y2, &z2);


    Achso, was ich vergessen habe, die drawRect triggerst du mit nem Timer (z.b.), damit hast du immer aktuelle Werte für die Matrizen
  • Nobik schrieb:

    Warum bekomme ich die Viewport-Werte in meiner "mouseMove"-Methode erst dann, wenn sich das Frame der NSOpenGLView verändert hat?

    Kontext nicht aktiv?


    Nobik schrieb:

    Ist es so vorgegeben, dass ich die Abfragen der Matrizen bzw. des Viewports in der "drawRect"-Methede durchführen soll?

    Es ist gar nichts vorgegeben. Solange Du vorher den Kontext aktivierst, solltest Du es sonst wo machen können.
    C++
  • wolf_10de schrieb:

    zerm schrieb:

    Kontext nicht aktiv?

    nein, die Werte ändern sich nur beim reshape

    Ich hab den OP so verstanden, dass glGetIntegerv(GL_VIEWPORT, &intArray) die Werte im intArray nicht ändert. Die Funktion sollte aber immer, zu jedem Zeitpunkt, den aktuellen Viewport liefern.
    Wie er zur Zeit der Abfrage definiert ist, ist eine andere Sache. Natürlich sollte er erstmal auf etwas vernünftiges gesetzt sein, bevor man ihn abfragt. Von Haus aus sollte der Server aber den Viewport auf genau die initiale Fenstergröße des neuen Kontextes setzen.
    C++
  • Ja das stimmt schon, der Viewport ändert sich ja aber nur beim resizen des Fensters. Im Prinzip würde es auch reichen ihn dort abzufragen. da ich aber immer auch die Modelview brauche usw... habe ich alle 3 Funktionen in die draw Rect gepackt, weil die über nen Timer getriggert wird. Ist zwar nicht sehr performant, reicht aber für nen Editor alle mal.
  • zerm schrieb:

    wolf_10de schrieb:

    zerm schrieb:

    Kontext nicht aktiv?

    nein, die Werte ändern sich nur beim reshape

    Ich hab den OP so verstanden, dass glGetIntegerv(GL_VIEWPORT, &intArray) die Werte im intArray nicht ändert. Die Funktion sollte aber immer, zu jedem Zeitpunkt, den aktuellen Viewport liefern.
    Wie er zur Zeit der Abfrage definiert ist, ist eine andere Sache. Natürlich sollte er erstmal auf etwas vernünftiges gesetzt sein, bevor man ihn abfragt. Von Haus aus sollte der Server aber den Viewport auf genau die initiale Fenstergröße des neuen Kontextes setzen.


    Genau das ist es nämlich. Die "glGetIntegerv(GL_VIEWPORT, &intArray)" liefert mir erst dann einen vernünftigen wert, wenn sich das Frame der View geändert hat. Bis dahin bleiben die Werte im "intArray" unangetastet. Die Methode läuft durch und generiert auch keinen Fehler.

    Ich lasse nun vorerst die Matrizen in der "drawRect-Methode" zwischen speichern und greife später in den "mouse-Methoden" darauf zu.
  • Nobik schrieb:

    zerm schrieb:

    Kontext nicht aktiv?

    Das lag wohl doch am Context.
    In der "mouseMoved"-Methode habe ich mir den CurrentContext ausgeben lassen, dieser war "nil". Also bei der NSOpenGLView den Context mit "makeCurrentContext" auf aktiv gesetzt und es funzt :huh:

    Macht keinen Sinn, hast du ne Renderausgabe gehabt ??
  • wolf, kann doch durchaus sein, dass mouseMoved in einem anderen (oder keinen) Kontext läuft, weil vorher ein anderer Kontext (anderes Fenster) aktiv war? Soweit ich weiss garantieren doch nur eine handvoll Methoden, dass der Kontext auch aktiv ist. Und mouseMoved gehört da evtl. nicht mit dazu :)
    C++