Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

2 Fenster: Eins für OpenGL und das andere für normale grafik

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
-schumi-



Anmeldungsdatum: 28.10.2009
Beiträge: 131
Wohnort: Südbayern

BeitragVerfasst am: 28.05.2010, 19:22    Titel: 2 Fenster: Eins für OpenGL und das andere für normale grafik Antworten mit Zitat

Hallo.

Ich hab mich inzwischen 2 Tage mit OpenGL auseinander gesetzt und bin total begeistert!
Dummerweise ist die normalen Grafik/Textausgabe beim OGL-Fenster wirkungslos. mit dem Kopf durch die Mauer wollen
Also: 2. Fenster muss her

FB ist dafür ja nich konzipiert, aber mit der Suche hab ich folgendes gefunden:
http://forum.qbasic.at/viewtopic.php?t=6715&highlight=fenster

Das mit der DLL gefällt mir gut, hier noch mal der Code:

(Als screenDLL.bas benennen und dann als DLL compilieren)
Code:
'FBGFX-2.COLOR: RGB(255, 163, 79);">Fenster (muss kompiliert werden mit fbc -dll -EXPORT)

'Ruft einen SCREEN auf
SUB screen2 CDECL ALIAS "screen2"(W AS INTEGER, H AS INTEGER, D AS INTEGER) EXPORT
    SCREENRES W,H,D
END SUB

'Stellt den inhalt eines Buffers auf dem SCREEN dar
SUB Refresh CDECL ALIAS "refresh"(buffer AS ANY PTR) EXPORT
    PUT(0,0), buffer,PSET
END SUB


(Das hier ganz normal compilieren)
Code:
DIM i2 AS ANY PTR
DIM dll AS ANY PTR
DIM Screen2 AS SUB CDECL (w AS INTEGER,h AS INTEGER, d AS INTEGER)
DIM Refresh AS SUB CDECL (buffer AS ANY PTR)

dll = DYLIBLOAD("screenDLL.dll")
screen2 = DYLIBSYMBOL( dll, "screen2" )
refresh = DYLIBSYMBOL( dll, "refresh" )

SCREENRES 400,400,32
screen2(300,300,32)
i2 = IMAGECREATE(300,300)
LINE(0,0)-(400,400),RGB(255,0,0),BF
LINE i2,(0,0)-(300,300),RGB(0,255,0),BF
refresh(i2)

SLEEP


Wenn ich jetzt aber eines der beiden Fenster mit dem Zusatz ...,&H02 für OpenGL declariere, hängt sich das Programm auf. Genauso wenn ich beide Fenster so declariere...

MFG
-schumi-

PS: Das mit dem Consolefenster kenne ich, aber da ist mit LINE etc. sense
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 30.05.2010, 15:15    Titel: Antworten mit Zitat

Hallo, es gibt hier im Forum eine Sdl-Lösung, die ich mal für mich umgebaut hatte.
Ich habe jetzt 2 Fenster, eins wo nur Ogl abläuft und eins wo ich auf einem Freebasicscreen meine unabhängigen Ausgaben machen kann, sogar die normalen Grafikausgaben von Freebasic.

Dieses Sdl ist unter Freebasic sehr pflegeleicht.

http://forum.qbasic.at/viewtopic.php?t=7094

gruss


Zuletzt bearbeitet von funkeld am 30.05.2010, 22:31, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
-schumi-



Anmeldungsdatum: 28.10.2009
Beiträge: 131
Wohnort: Südbayern

BeitragVerfasst am: 30.05.2010, 22:05    Titel: Antworten mit Zitat

Hey, das ist genau das was ich gesucht hab! (Zumindest soweit ich das bei einem erster copy&paste-run beurteilen konnte grinsen )

Ich hab schon angefangen, ein 2. Programm pararell zu starten, das dann mit 2 Textdateien mit dem Hauptprogramm kommuniziert. PRINT, COLOR, CLS, LOCATE und SYSTEM konnte es schon. Aber der ständige zugriff auf die Festplatte um zu überprüfen ob neue Befehle übergeben wurden ist ganz und gar nicht ideal...

Also vielen Dank nochmal!
-schumi-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 30.05.2010, 22:21    Titel: Antworten mit Zitat

Einmal ein OGL-Fenster und ein FreeBasicfenster ohne "SDL".

Aktiviere mit einem Mausklick den rechten Freebasic-Screen, dann drücke die Q-taste. Es wird dann auf dem Freebasic-Screen jedesmal ein Punkt mit Pset gezeichnet.
So kann man das 2. Fenster dann nutzen.

Gruss


Code:

#include once "GL/gl.bi"
#include once "GL/glu.bi"
#include once "GL/glfw.bi"
#include "fbgfx.bi"
#include "windows.bi"
Using FB

Declare Sub zeichne()
Declare Sub draw_test( )
Declare Sub init_gl()
Declare Sub WindowSizeFun GLFWCALL( )

ScreenRes 400,400,32
ScreenControl SET_WINDOW_POS, 600,50
Dim Shared rtri As Single, rquad As Single
Dim Shared as integer width_, height,running,x,y

   glfwInit( )
   If (glfwOpenWindow( 500, 500, 0,0,0,0, 16,0, GLFW_WINDOW ) = 0 ) then
      glfwTerminate()
      End 0
   end If
   glfwSetWindowTitle( "test" )
   glfwSetWindowSizeCallback( @WindowSizeFun )
   
   init_gl( )
   
   Do   
      glClear( GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT )
      glClearColor( 1.0, 1.0, 0.0, 0.0 )
      
      draw_test( )
         
      glfwSleep( 0.025 ) 
        glfwSwapBuffers( )
        
        If MultiKey( FB.SC_q ) Then 
            zeichne()
        End If
           
        running = (glfwGetKey( GLFW_KEY_ESC ) = 0) and _
                (glfwGetWindowParam( GLFW_OPENED ) = 1)
                 
   loop while( running )

   glfwTerminate( )
   end 0
   
Sub draw_test( )
  glClear        GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT
  glLoadIdentity
  glTranslatef   -1.5, 0, -6
  glRotatef      rtri, 0, 1, 0
  glBegin GL_TRIANGLES
    glColor3f 1, 0, 0:glVertex3f  0, 1, 0
    glColor3f 0, 1, 0:glVertex3f -1,-1, 0
    glColor3f 0, 0, 1:glVertex3f  1,-1, 0
  glEnd
  glLoadIdentity
  glTranslatef   1.5, 0  ,-6
  glRotatef rquad,  1, 0  , 0
  glBegin GL_QUADS
    glColor3f 1, 0, 0:glVertex3f -1, 1, 0
    glColor3f 0, 1, 0:glVertex3f  1, 1, 0
    glColor3f 0, 0, 1:glVertex3f  1,-1, 0
    glColor3f 1, 1, 0:glVertex3f -1,-1, 0
  glEnd
  rtri  += 1
  rquad += 2
  Flip
End sub

sub init_gl( )
   glMatrixMode   GL_PROJECTION
   glLoadIdentity
   gluPerspective 45, 1, 0.1, 100
   glMatrixMode   GL_MODELVIEW
   glLoadIdentity
   glShadeModel   GL_SMOOTH
   glClearColor   0,0,0,1
   glClearDepth   1
   glEnable       GL_DEPTH_TEST
   glDepthFunc    GL_LEQUAL
   glHint         GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST
End Sub

Sub WindowSizeFun GLFWCALL( )
   width_ = 500
   height = 500
End Sub

Sub zeichne()
   x=x+1
   y=y+1
   PSet (x,y),RGB(255,0,0)
End Sub   
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
-schumi-



Anmeldungsdatum: 28.10.2009
Beiträge: 131
Wohnort: Südbayern

BeitragVerfasst am: 30.05.2010, 23:13    Titel: Antworten mit Zitat

Oha, jetz werd ich mit Lösungen überschüttet oder was? happy

Ich hab mich jetz erst mal mit der SDL-Lösung auseinandergesetzt und dein Programm auf ein Minimum reduziert (um eine bessere Übersicht gewinnen zu können)
Könntest du mir bitte die Fragen beantworten, die ich im Code als Kommentar dazugeschrieben hab?

Code:

#INCLUDE  "SDL/SDL.bi"
#INCLUDE  "GL/gl.bi"
#INCLUDE  "GL/glu.bi"


IF SDL_Init(SDL_INIT_EVERYTHING) <> 0 THEN
   END 1
END IF
IF SDL_SetVideoMode(640, 480, 16, SDL_OPENGL OR SDL_OPENGLBLIT) = 0 THEN
   SDL_Quit
   END 1
END IF
SDL_WM_SetCaption "OpenGL-Window", ""   '***** Das 1. ist ja anscheinend der Fenstertitel, aber das zweite???


SCREENRES 200,400,32
PRINT "Hallo, ich bin das"
PRINT "normale FB-Fenster!"
LINE (10, 50)-(50, 150), RGB(0, 255, 0), BF


 
'----- init OpenGL (Auszug aus dem OGL-Tutorial)
   glViewport 0, 0, 640, 480
   glMatrixMode GL_PROJECTION
   glLoadIdentity
   gluPerspective 45.0, 640/480, 0.1, 100.0
   glMatrixMode GL_MODELVIEW
   glLoadIdentity
   glClearColor 0.1, 0.1, 0.1, 0.1
   glClearDepth 1.0
   glEnable GL_DEPTH_TEST
   glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
'----- END init OpenGL


DIM event AS SDL_Event
DO
   
   glClear  GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT
        glBegin GL_QUADS
         glColor3f 1.0, 0.6, 0.0                              
         glVertex3f  -2, -2, -8
         glVertex3f   2, -2, -8
         glVertex3f   2, -2,  2
         glVertex3f  -2, -2,  2
         
         glVertex3f  -2,  2, -8
         glVertex3f   2,  2, -8
         glVertex3f   2,  2,  2
         glVertex3f  -2,  2,  2
      glEND
           
   glFlush            '***** Ist das für das Licht? Wo ist "FLIP" abgeblieben? *****

   SDL_GL_SwapBuffers   '***** Was bewirkt der Befehl? *****
   SDL_PumpEvents         '***** Was bewirkt der Befehl? *****

LOOP UNTIL( (SDL_PollEvent( @event ) <> 0) AND ((event.TYPE = SDL_KEYDOWN) OR (event.TYPE = SDL_MOUSEBUTTONDOWN)) )

SDL_Quit


Werd mir derweil mal die 2. Lösung angucken happy
-schumi-

[EDIT]
"So kann man das 2. Fenster dann nutzen. " - Also das normale. Aber das kann ich ja hier auch mit den ganz normalen Befehlen. Hab ich ja auch in dem Code mit 'PRINT "Hallo, ich bin...' gemacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
funkeld
gesperrt


Anmeldungsdatum: 10.10.2009
Beiträge: 179

BeitragVerfasst am: 31.05.2010, 11:28    Titel: Antworten mit Zitat

Hallo, hier ist ist eine gute DGL-Wiki , wo fast alles in deutsch drin steht Opengl , SDL usw.. Wunderbar...... lächeln

Die nehme ich auch als Nachschlagewerk.

Und jetzt :

http://wiki.delphigl.com/index.php/glFlush ,

http://wiki.delphigl.com/index.php/SDL_PumpEvents ,

http://wiki.delphigl.com/index.php/SDL_GL_SwapBuffers

Toll, nicht wahr. Ist dort schön beschrieben.

Den Titel Setzen für das Freebasicfenster schau mal hier im Forum, es wurde schon einmal behandelt.

Deine Befehle/Aufrufe/Sub/ für das normale Freebasicfenster musst du dann in der Do-Loop einbinden bzw aufrufen.

Gruss
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
-schumi-



Anmeldungsdatum: 28.10.2009
Beiträge: 131
Wohnort: Südbayern

BeitragVerfasst am: 31.05.2010, 15:58    Titel: Antworten mit Zitat

Hey, danke!

Das Wiki ist wirklich gut, vor allem kurz und verständlich zwinkern

Damit darf ich verkünden:
Problem gelöst!

MfG
-schumi-
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz