JOGL/JNI: Rendern in GLJPanel mit C++

Dead_Poet

Mitglied
Guten Tag zusammen!

Ich grübel jetzt schon eine ganze Weile über folgendes Problem:

Ich habe einen JFrame, in dem ich ein GLJPanel (aus JOGL) platziere.
Jetzt möchte ich gern mit C++ (über JNI) in dieses GLJPanel Objekte rendern.
Dazu müsste ich irgendwie an die Window-ID von dem GLJPanel kommen. Dann wäre mein Problem im Prinzip schon gelöst, denn das eigentlich Rendern mache ich dann über den OpenSceneGraph.
Bisher hab ich es leider nur geschafft, die Window-ID von dem JFrame zu bekommen (über GetForegroundWindow( ) in C++).
Kurz gesagt suche ich also nach einer nativen Funktion, der ich ein GLJPanel übergebe und die mir die Window-ID davon zurückliefert. Oder hat so ein GLJPanel gar keine eigene Window-ID?
Hat da jemand ne Idee? Oder gehört das schon eher ins C++-Forum?

Viele Dank schonmal vorab für eventuelle Antworten.
 
Hallo!

Schau doch mal in der Windows Implementierung von Jogl in com.sun.opengl.impl.windows.WindowsGLDrawable
das Teil ist von GLDrawableImpl welches wiederum das GLDrawable Interface implementiert.

Du kannst ja mal versuchen an ein GLDrawable heranzukommen und (wenn das vom Typ WindowsGLDrawable ist)
auf WindowsGLDrawable casten. Anschliessend kannst du mit der Methode
public long getHDC
Auf das Handle des DeviceContexts zugreifen...

Wär zumindest ein Versuch Wert ;-)


Gruß Tom
 
Hallo!

Habe den Vorschlag mit dem WindowsGLDrawable mal ausprobiert. Dabei konnte ich zunächst per Debugger feststellen, dass mein Canvas vom Typ WindowsOnscreenGLDrawable ist.
Leider hab ich jetzt das Problem, dass mir getHDC( ) immer "0" zurückliefert. Hier der Code dazu:

Java:
public class MyGLCanvas extends GLCanvas {

...
 
public long getHandle( ) {
        long lHandle;
        WindowsOnscreenGLDrawable winGLDraw = (WindowsOnscreenGLDrawable) this.getContext( ).getGLDrawable( );
        lHandle = winGLDraw.getHDC( );
        return lHandle;
}
 
}

Hab jetzt leider keine Idee mehr, wo ich noch weitersuchen könnte. :(
 
Sichtbar isser wohl. Hab den Canvas zusammen mit einem Button in einen Frame gepackt und hole mir den Handler dann erst in der actionperformed-Methode des Buttons.
 
So, hab mich jetzt mal durch die JOGL-Sourcen gewühlt und was gefunden, das ich jetzt bei mir eingebaut hab:

Java:
public long getHandle( ) {
        long lHandle;
        
        JAWT_DrawingSurface ds = JAWT.getJAWT( ).GetDrawingSurface(this);
        ds.Lock( );
        JAWT_DrawingSurfaceInfo dsi = ds.GetDrawingSurfaceInfo( );
        JAWT_Win32DrawingSurfaceInfo win32dsi = (JAWT_Win32DrawingSurfaceInfo) dsi.platformInfo( );
        lHandle = win32dsi.hdc( );
        ds.Unlock( );
        
        return lHandle;
    }

Wenn ich jetzt in meinem Testframe den Handler per Button-Klick abfrage, dann kriege ich immerhin nicht mehr "0" sondern nen long-Wert, der nach ner Window-ID aussieht. Komisch ist nur, dass bei jeder Abfrage (ohne die Anwendung neu zu starten) ein neuer Wert für den Handler rauskommt.
Hat das Teil dann bei jedem Render-Durchgang einen anderen Handler? Klingt etwas umständlich...

Naja, werd's damit erstmal weiterprobieren.

Vielen Dank die Hilfe soweit. :)
 
Zuletzt bearbeitet:
Zurück