Byte-Welt Forum

Zurück   Byte-Welt Forum > Projekte / Projects > Swogl / JCuda / JOCL > Swogl

Antwort
 
Themen-Optionen Thema durchsuchen
Alt 06.08.2011, 14:16   #1
Beni
Moderator
 
Benutzerbild von Beni
 
Registriert seit: 27.08.2006
Beiträge: 1.635
Beni befindet sich auf einem aufstrebenden Ast
Standard Issue: reparenting SwoglContainer

Hi Marco

Ich habe mal ein bisschen mit Swogl rumgespielt, und dabei ist mir folgendes aufgefallen: Wenn man einen SwoglContainer von einem Window in ein anderes schiebt, gehen alle Texturen verloren. Unten ist ein Program, welches bei mir den Fehler immer reproduzieren kann (einfach auf den einsamen JButton klicken...).

Getestet mit Java 1.6, Ubuntu 64 bit, LWJGL

Java Code:
  1. package test;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Component;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7.  
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JPanel;
  11.  
  12. import de.javagl.swogl.SwoglApplication;
  13. import de.javagl.swogl.SwoglApplications;
  14. import de.javagl.swogl.SwoglContainer;
  15. import de.javagl.swogl.samples.SwoglDemoComponents;
  16.  
  17. public class EmptySwoglTest {
  18.     public static void main( String[] args ){
  19.         final JFrame frameA = new JFrame("A");
  20.         final JFrame frameB = new JFrame("B");
  21.        
  22.         frameA.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  23.         frameB.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  24.        
  25.         frameA.setBounds( 20, 20, 400, 320 );
  26.         frameB.setBounds( 20, 340, 400, 300 );
  27.        
  28.         JButton action = new JButton( "click me" );
  29.         final Component panel = createSwoglPanel();
  30.         frameA.add( panel, BorderLayout.CENTER );
  31.        
  32.         frameA.add( action, BorderLayout.NORTH );
  33.         action.addActionListener( new ActionListener(){
  34.             private boolean state = true;
  35.            
  36.             @Override
  37.             public void actionPerformed( ActionEvent e ){
  38.                 if( state ){
  39.                     frameB.add( panel, BorderLayout.CENTER );
  40.                 }
  41.                 else{
  42.                     frameA.add( panel, BorderLayout.CENTER );
  43.                 }
  44.                 state = !state;
  45.             }
  46.         });
  47.        
  48.         frameA.setVisible( true );
  49.         frameB.setVisible( true );
  50.     }
  51.    
  52.     private static Component createSwoglPanel(){
  53.         JPanel panel = new JPanel( new BorderLayout() );
  54.        
  55.         SwoglApplication swoglApplication = SwoglApplications.createSwoglApplication();
  56.  
  57.         SwoglContainer swoglContainer = SwoglContainer.create( swoglApplication );
  58.         Component mainComponent = swoglContainer.getMainComponent();
  59.         panel.add( mainComponent, BorderLayout.CENTER );
  60.  
  61.         // Create the SwoglComponents for this sample and adds them to the
  62.         // SwoglContainer
  63.         swoglContainer.add( SwoglDemoComponents.createSwoglLogoComponent() );
  64.         swoglContainer.add( SwoglDemoComponents.createTableComponent() );
  65.         swoglContainer.add( SwoglDemoComponents.createTextComponent() );
  66.         swoglContainer.add( SwoglDemoComponents.createSplitPaneComponent() );
  67.         swoglContainer.add( SwoglDemoComponents.createTreeComponent() );
  68.        
  69.         return panel;
  70.     }
  71. }
__________________
Beni ist offline   Mit Zitat antworten
Alt 06.08.2011, 16:39   #2
Marco13
Super-Moderator
 
Registriert seit: 05.08.2008
Beiträge: 1.418
Marco13 befindet sich auf einem aufstrebenden Ast
Standard Re: Issue: reparenting SwoglContainer

(See below for a short english summary)

Hallo

Das konkrete Programm kann ich hier gerade nicht testen, aber falls notwendig mache ich das am Dienstag. Ich denke aber, dass das Problem schon in ähnlicher Form berichtet wurde bzw. bekannt ist: Dort ging es darum, dass bei einem Verschieben eines SwoglContainers von einem Tab eines JTabbedPane auf ein anderes Tab die Texturen verloren gingen (in diesem Fall mit JOGL, aber die Ursache ist wohl die gleiche).

Tatsächlich ist das kein Swogl-spezifisches Problem, sondern eins der üblichen OpenGL-Anbindungen: Die OpenGL-Anbindungen erstellen ein natives Fenster, das quasi als handle für den OpenGL context dient. Dieses Fenster wird lebendig sobald es auf dem Bildschirm erscheint - d.h. wenn es irgendwo in der Component-Hierarchie unter einem sichtbaren JFrame hängt (Stichworte: JComponent native peer & Co). Und das entscheidende: Wenn es von dieser sichtbaren Hierarchie entfernt wird, dann wird der OpenGL context zerstört - und damit alle Daten und Textur-IDs, die darin erzeugt wurden. (Das gleiche Problem würde also auch bei Texturen auftreten, die man selbst mit glGenTextures erstellt hätte, wenn man den GLCanvas verschieben wollte).

Allerdings sollte Swogl für reine Anwender (die sich nicht einen eigenen Renderer schreiben wollen) ja so weit wir möglich irgendwelche GL-Spezifika verstecken. Alles sollte sich so handhaben lassen wie "normales" Swing - abgesehen von der heavyweight rendering-component. Es gibt einen Workaround, der schon funktionieren würde, aber SO unschön ist, dass ich ihn ungern jemandem zumuten würde: Alle SwoglComponents neu erstellen und neu hinzufügen . Stattdessen würde ich das lieber so weit wie möglich automatisch machen: Alle notwendigen Daten für eine neu-initialisierung der GL-IDs sind ja vorhanden. Für JOGL hatte ich das schon eingebaut (ich glaube aber noch nicht in der Version, die gerade auf der Seite steht). Bei LWJGL könnte es schwieriger sein, zu erkennen, wann der Kontext zerstört wurde, aber ich werde nächste Woche gleich mal schauen, wo man da ansetzen könnte.

Ich habe viel gebastelt in letzter Zeit, nächste Woche wird die Seite ein bißchen aktualisiert und eine neue Version hochgeladen. Vielleicht schaffe ich es da schon, diese automatische neu-Initialisierung einzubauen.

bye
Marco


--- Short english summary:

When a SwoglContainer is moved from one Frame to another one, all the Textures are lost. More general, this happens when removing a SwoglContainer from the component hierarchy and adding it again. This behavior is not specific for Swogl. Instead, it's due to the behavior of the underlying OpenGL bindings: When the rendering component is removed from its parent, then the OpenGL context is destroyed - and thus, all the textures are lost. I'll try to integrate an functionality to automatically re-initialize the textures when a SwoglContainer is removed from its parent and added to another one.
Marco13 ist offline   Mit Zitat antworten
Alt 06.08.2011, 20:02   #3
Beni
Moderator
 
Benutzerbild von Beni
 
Registriert seit: 27.08.2006
Beiträge: 1.635
Beni befindet sich auf einem aufstrebenden Ast
Standard AW: Issue: reparenting SwoglContainer

Ich hab derzeit nicht vor wirklich was mit Swogl zu machen. Ich habe einfach irgendeine krasse native Component gebraucht um in meinem Framework was auszuprobieren.

Vielleicht nützt dir der java.awt.event.HierarchyListener was, der sollte dir sagen, wann eine Component herumgeschoben wurde.
__________________
Beni ist offline   Mit Zitat antworten
Alt 06.08.2011, 22:22   #4
Marco13
Super-Moderator
 
Registriert seit: 05.08.2008
Beiträge: 1.418
Marco13 befindet sich auf einem aufstrebenden Ast
Standard Re: Issue: reparenting SwoglContainer

Ja, das wäre vielleicht eine Möglichkeit. Bei JOGL ist's relativ leicht: Dort ändert sich das GL-Objekt (auch wenn das kein wirklich zuverlässiges Kriterium ist). Aber für LWJGL muss ich mal schauen. Mit einem HierarchyListener könnte das sogar gehen.
Marco13 ist offline   Mit Zitat antworten
Alt 09.08.2011, 21:29   #5
Marco13
Super-Moderator
 
Registriert seit: 05.08.2008
Beiträge: 1.418
Marco13 befindet sich auf einem aufstrebenden Ast
Standard Re: Issue: reparenting SwoglContainer

In der aktualisierten Version (0.3.0) auf http://swogl.javagl.de/ sollte auch das reparenting funktionieren.
Marco13 ist offline   Mit Zitat antworten
Alt 09.08.2011, 21:58   #6
Beni
Moderator
 
Benutzerbild von Beni
 
Registriert seit: 27.08.2006
Beiträge: 1.635
Beni befindet sich auf einem aufstrebenden Ast
Standard AW: Issue: reparenting SwoglContainer

Supi
__________________
Beni ist offline   Mit Zitat antworten
Alt 10.08.2011, 01:16   #7
Marco13
Super-Moderator
 
Registriert seit: 05.08.2008
Beiträge: 1.418
Marco13 befindet sich auf einem aufstrebenden Ast
Standard Re: Issue: reparenting SwoglContainer

Irgendwann (07.02.2010) stand ja auch mal eine Swogl-DockStation im Raum - hast du die Idee wiederbelebt?
Zugegeben: So eine lange Entwicklungspause wie jetzt bei Swogl wirkt nicht gerade Vertrauenserweckend
Arbeitest du an DockingFrames eigentlich Vollzeit? Wenn ich mir den Umfang der Bibliothek, die Aktivität hier im Forum und die release notes da immer ansehe...
Marco13 ist offline   Mit Zitat antworten
Alt 10.08.2011, 19:06   #8
Beni
Moderator
 
Benutzerbild von Beni
 
Registriert seit: 27.08.2006
Beiträge: 1.635
Beni befindet sich auf einem aufstrebenden Ast
Standard Re: Issue: reparenting SwoglContainer

Weit weg von Vollzeit, maximal 4-5 Stunden in der Woche.

Die Idee mit der DockStation geistert noch herum, aber ich weiss immernoch nicht wie die überhaupt aussehen soll. Und bis mir nichts gescheites eingefallen ist, wird das Projekt weiterhin schlafen.
__________________
Beni ist offline   Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Swogl] RFE: Custom rendering and initialization in SwoglContainer Marco13 Swogl 4 23.06.2011 21:13
General Refresh Issue keloe DockingFrames 4 21.01.2011 18:03
Normalize Issue Kamal DockingFrames 7 19.02.2010 17:11
Resize Request Possible Issue Eduardo Born DockingFrames 9 19.11.2009 20:33
Hide/Show Stacked Dockable incorrect content issue with Eclipse Theme scottabernethy DockingFrames 2 31.03.2009 20:53


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:59 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.