 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
-schumi-

Anmeldungsdatum: 28.10.2009 Beiträge: 131 Wohnort: Südbayern
|
Verfasst am: 28.05.2010, 19:22 Titel: 2 Fenster: Eins für OpenGL und das andere für normale grafik |
|
|
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.
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 |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 30.05.2010, 15:15 Titel: |
|
|
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 |
|
 |
-schumi-

Anmeldungsdatum: 28.10.2009 Beiträge: 131 Wohnort: Südbayern
|
Verfasst am: 30.05.2010, 22:05 Titel: |
|
|
Hey, das ist genau das was ich gesucht hab! (Zumindest soweit ich das bei einem erster copy&paste-run beurteilen konnte )
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 |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
Verfasst am: 30.05.2010, 22:21 Titel: |
|
|
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 |
|
 |
-schumi-

Anmeldungsdatum: 28.10.2009 Beiträge: 131 Wohnort: Südbayern
|
Verfasst am: 30.05.2010, 23:13 Titel: |
|
|
Oha, jetz werd ich mit Lösungen überschüttet oder was?
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
-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 |
|
 |
funkeld gesperrt
Anmeldungsdatum: 10.10.2009 Beiträge: 179
|
|
Nach oben |
|
 |
-schumi-

Anmeldungsdatum: 28.10.2009 Beiträge: 131 Wohnort: Südbayern
|
Verfasst am: 31.05.2010, 15:58 Titel: |
|
|
Hey, danke!
Das Wiki ist wirklich gut, vor allem kurz und verständlich
Damit darf ich verkünden:
Problem gelöst!
MfG
-schumi- |
|
Nach oben |
|
 |
|
|
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.
|
|