Code: Select all
IncludeFile "OpenGL.pbi"
Structure GLviewInfo
hWnd.l
hDC.l
glContext.l
EndStructure
Structure StartGLthread
ViewNumber.l
hWnd.l
EndStructure
#GLviews = 5
Dim Threads.l(#GLviews)
Dim StopThread.l(#GLviews)
Dim DrawGLview_RollAxisX.f(#GLviews)
Dim DrawGLview_RollAxisY.f(#GLviews)
Dim DrawGLview_RollAxisZ.f(#GLviews)
Dim DrawGLview_position.f(#GLviews)
Dim DrawGLview_rotatespeed.f(#GLviews)
Dim DrawGLview_circlespeed.f(#GLviews)
Dim DrawGLview_deltatime.f(#GLviews)
Dim DrawGLview_oldmillisecs.f(#GLviews)
Dim DrawGLview_StartTime.l(#GLviews)
Dim DrawCube_RollAxisX.f(#GLviews)
Dim DrawCube_RollAxisY.f(#GLviews)
Dim DrawCube_RollAxisZ.f(#GLviews)
Dim DrawCube_RotateSpeedX.f(#GLviews)
Dim DrawCube_RotateSpeedY.f(#GLviews)
Dim DrawCube_RotateSpeedZ.f(#GLviews)
Dim DrawCube_ZoomFactor.f(#GLviews)
Dim DrawCube_deltatime.f(#GLviews)
Dim DrawCube_oldmillisecs.f(#GLviews)
Dim GL_ViewWindow.GLviewInfo(#GLviews) ; How many GLviews ??
Procedure SetupGLWindow(ViewNumber,Window)
Shared GL_ViewWindow
pfd.PIXELFORMATDESCRIPTOR
hdc = GetDC_(Window)
pfd\nSize = SizeOf(PIXELFORMATDESCRIPTOR)
pfd\nVersion = 1
pfd\dwFlags = #PFD_SUPPORT_OPENGL|#PFD_DOUBLEBUFFER|#PFD_DRAW_TO_WINDOW
pfd\dwLayerMask = #PFD_MAIN_PLANE
pfd\iPixelType = #PFD_TYPE_RGBA
pfd\cColorBits = 16
pfd\cDepthBits = 16
SetPixelFormat_(hdc,ChoosePixelFormat_(hdc,pfd),pfd)
hrc=wglCreateContext_(hdc)
wglMakeCurrent_(hdc,hrc)
GL_ViewWindow(ViewNumber)\hWnd = Window
GL_ViewWindow(ViewNumber)\glContext = hrc
glEnable_ (#GL_CULL_FACE) ; This will enhance the rendering speed as all the back face will be
; ignored. This works only with CLOSED objects like a cube... Singles
; planes surfaces will be visibles only on one side.
GetClientRect_(Window,WinSize.RECT)
glViewport_(0,0,WinSize\right,WinSize\bottom)
ReleaseDC_(Window,hdc)
wglMakeCurrent_(0,0)
EndProcedure
Procedure DrawGLview_Thread(ViewNumber)
Shared DrawGLview_RollAxisX, DrawGLview_RollAxisY, DrawGLview_RollAxisZ
Shared DrawGLview_position , DrawGLview_circlespeed, DrawGLview_rotatespeed
Shared GL_ViewWindow, DrawGLview_deltatime, DrawGLview_oldmillisecs
Shared DrawGLview_StartTime, StopThread
GL_ViewWindow(ViewNumber)\hDC = GetDC_(GL_ViewWindow(ViewNumber)\hWnd)
wglMakeCurrent_(GL_ViewWindow(ViewNumber)\hDC,GL_ViewWindow(ViewNumber)\glContext)
Repeat
DrawGLview_deltatime(ViewNumber) = TimeGetTime_() - DrawGLview_oldmillisecs(ViewNumber)
DrawGLview_oldmillisecs(ViewNumber) = TimeGetTime_()
DrawGLview_StartTime(ViewNumber) = TimeGetTime_()
;pre-render stuff
glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
glEnable_(#GL_LIGHTING)
glEnable_(#GL_LIGHT0)
;set up axes
glPushMatrix_()
glMatrixMode_(#GL_MODELVIEW)
DrawGLview_position(ViewNumber) = DrawGLview_position(ViewNumber)+DrawGLview_circlespeed(ViewNumber)+(DrawGLview_deltatime(ViewNumber)/1000)
glTranslatef_(Sin(DrawGLview_position(ViewNumber)),Cos(DrawGLview_position(ViewNumber)),0)
glRotatef_ (DrawGLview_RollAxisZ(ViewNumber), 0, 0, 0.001)
DrawGLview_RollAxisZ(ViewNumber)+DrawGLview_rotatespeed(ViewNumber)+(DrawGLview_deltatime(ViewNumber)/1000)
;construct mesh
glBegin_ (#GL_POLYGON)
glNormal3f_(0,0,1.0)
glVertex3f_(0.5,0.5,0)
glVertex3f_(0,0.5,0)
glVertex3f_(0,0,0)
glVertex3f_(0.5,0,0)
glEnd_()
;render
glPopMatrix_()
glFinish_()
SwapBuffers_(GL_ViewWindow(ViewNumber)\hDC)
;ReleaseDC_(GL_ViewWindow(ViewNumber)\hWnd,GL_ViewWindow(ViewNumber)\hDC)
While TimeGetTime_() - DrawGLview_StartTime(ViewNumber) < 40: Sleep_(1):Wend ; 1000ms / 25 frames = 40
Until StopThread(ViewNumber) = 1
; End of thread
ReleaseDC_(GL_ViewWindow(ViewNumber)\hWnd,GL_ViewWindow(ViewNumber)\hDC)
StopThread(ViewNumber) = 0
EndProcedure
Procedure Start_DrawGLview(ViewNum,hWnd)
SetupGLWindow(ViewNum,hWnd)
Threads(ViewNum) = CreateThread(@DrawGLview_Thread(),ViewNum)
EndProcedure
Procedure DrawCube_Thread(ViewNumber)
Shared GL_ViewWindow, StopThread
Shared DrawCube_RollAxisX, DrawCube_RollAxisY, DrawCube_RollAxisZ
Shared DrawCube_RotateSpeedX, DrawCube_RotateSpeedY, DrawCube_RotateSpeedZ
Shared DrawCube_ZoomFactor
GL_ViewWindow(ViewNumber)\hDC = GetDC_(GL_ViewWindow(ViewNumber)\hWnd)
wglMakeCurrent_(GL_ViewWindow(ViewNumber)\hDC,GL_ViewWindow(ViewNumber)\glContext)
Repeat
DrawCube_deltatime(ViewNumber) = TimeGetTime_() - DrawCube_oldmillisecs(ViewNumber)
DrawCube_oldmillisecs(ViewNumber) = TimeGetTime_()
DrawGLview_StartTime(ViewNumber) = TimeGetTime_()
glPushMatrix_() ; Save the original Matrix coordinates
glMatrixMode_(#GL_MODELVIEW)
;glTranslatef_(0, 0, DrawCube_ZoomFactor(ViewNumber)) ; move it forward a bit
glRotatef_ (DrawCube_RollAxisX(ViewNumber), 1.0, 0, 0) ; rotate around X axis
glRotatef_ (DrawCube_RollAxisY(ViewNumber), 0, 1.0, 0) ; rotate around Y axis
glRotatef_ (DrawCube_RollAxisZ(ViewNumber), 0, 0, 1.0) ; rotate around Z axis
DrawCube_RollAxisX(ViewNumber) + DrawCube_RotateSpeedX(ViewNumber) +(DrawCube_deltatime(ViewNumber)/1000)
DrawCube_RollAxisY(ViewNumber) + DrawCube_RotateSpeedY(ViewNumber) +(DrawCube_deltatime(ViewNumber)/1000)
DrawCube_RollAxisZ(ViewNumber) + DrawCube_RotateSpeedZ(ViewNumber) +(DrawCube_deltatime(ViewNumber)/1000)
; clear framebuffer And depth-buffer
glClear_ (#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
; draw the faces of a cube
; draw colored faces
glDisable_(#GL_LIGHTING)
glBegin_ (#GL_QUADS)
; Build a face, composed of 4 vertex !
; glBegin() specify how the vertexes are considered. Here a group of
; 4 vertexes (GL_QUADS) form a rectangular surface.
; Now, the color stuff: It's r,v,b but with float values which
; can go from 0.0 To 1.0 (0 is .. zero And 1.0 is full intensity)
glNormal3f_ (0,0,1.0)
glColor3f_ (0,0,1.0)
glVertex3f_ (0.5,0.5,0.5)
glColor3f_ (0,1.0,1.0)
glVertex3f_ (-0.5,0.5,0.5)
glColor3f_ (1.0,1.0,1.0)
glVertex3f_ (-0.5,-0.5,0.5)
glColor3f_ (0,0,0)
glVertex3f_ (0.5,-0.5,0.5)
; The other face is the same than the previous one
; except the colour which is nice blue To white gradiant
glNormal3f_ (0,0,-1.0)
glColor3f_ (0,0,1.0)
glVertex3f_ (-0.5,-0.5,-0.5)
glColor3f_ (0,0,1.0)
glVertex3f_ (-0.5,0.5,-0.5)
glColor3f_ (1.0,1.0,1.0)
glVertex3f_ (0.5,0.5,-0.5)
glColor3f_ (1.0,1.0,1.0)
glVertex3f_ (0.5,-0.5,-0.5)
glEnd_()
; draw shaded faces
glEnable_(#GL_LIGHTING)
glEnable_(#GL_LIGHT0)
glBegin_ (#GL_QUADS)
glNormal3f_ ( 0, 1.0, 0)
glVertex3f_ ( 0.5, 0.5, 0.5)
glVertex3f_ ( 0.5, 0.5,-0.5)
glVertex3f_ (-0.5, 0.5,-0.5)
glVertex3f_ (-0.5, 0.5, 0.5)
glNormal3f_ (0,-1.0,0)
glVertex3f_ (-0.5,-0.5,-0.5)
glVertex3f_ (0.5,-0.5,-0.5)
glVertex3f_ (0.5,-0.5,0.5)
glVertex3f_ (-0.5,-0.5,0.5)
glNormal3f_ (1.0,0,0)
glVertex3f_ (0.5,0.5,0.5)
glVertex3f_ (0.5,-0.5,0.5)
glVertex3f_ (0.5,-0.5,-0.5)
glVertex3f_ (0.5,0.5,-0.5)
glNormal3f_ (-1.0, 0, 0)
glVertex3f_ (-0.5,-0.5,-0.5)
glVertex3f_ (-0.5,-0.5, 0.5)
glVertex3f_ (-0.5, 0.5, 0.5)
glVertex3f_ (-0.5, 0.5,-0.5)
glEnd_()
glPopMatrix_()
glFinish_()
SwapBuffers_(GL_ViewWindow(ViewNumber)\hDC)
While TimeGetTime_() - DrawGLview_StartTime(ViewNumber) < 40: Sleep_(1):Wend ; 1000ms / 25 frames = 40
Until StopThread(ViewNumber) = 1
; End of thread
ReleaseDC_(GL_ViewWindow(ViewNumber)\hWnd,GL_ViewWindow(ViewNumber)\hDC)
StopThread(ViewNumber) = 0
EndProcedure
Procedure Start_DrawCube(ViewNum,hWnd)
SetupGLWindow(ViewNum,hWnd)
Threads(ViewNum) = CreateThread(@DrawCube_Thread(),ViewNum)
EndProcedure
Procedure.l OpenGLview(number,x,y,width,height)
;
; Open child window for OpenGL
;
#GL_Style = #WS_CHILD|#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN|#WS_VISIBLE|#WS_BORDER
#GL_XStyle = #WS_EX_OVERLAPPEDWINDOW
Shared OpenGLview_MainWnd.l, OpenGLview_hInstance
!EXTERN _PB_Window_Current
!MOV dword EAX, [_PB_Window_Current]
!MOV dword [v_OpenGLview_MainWnd], EAX ; Get current Window ( UseWindow() )
!MOV dword EAX, [_PB_Instance]
!MOV dword [v_OpenGLview_hInstance], EAX ; Get application instance
class$ = "OpenGLview_"+Str(number)
wc.WNDCLASSEX
wc\cbSize = SizeOf(WNDCLASSEX)
wc\style = 0
wc\lpfnWndProc = GetWindowLong_(OpenGLview_MainWnd,#GWL_WNDPROC)
wc\cbClsExtra = 0
wc\cbWndExtra = 0
wc\hInstance = OpenGLview_hInstance
wc\hIcon = 0
wc\hCursor = LoadCursor_(0, #IDC_CROSS) ; #IDC_ARROW = Arrow
; #IDC_SIZEALL = Size Arrow
; #IDC_CROSS = Cross
wc\hbrBackground = CreateSolidBrush_(RGB($8F,$8F,$8F))
wc\lpszMenuName = 0
wc\lpszClassName = @class$
wc\hIconSm = 0
RegisterClassEx_(@wc)
ProcedureReturn CreateWindowEx_( #GL_XStyle,class$,"",#GL_Style,x,y,width,height,OpenGLview_MainWnd,0,OpenGLview_hInstance,0)
EndProcedure
Procedure Stop_Threads()
For a = 1 To #GLviews
StopThread(a) = 1
Next a
Delay(100)
EndProcedure
;-------------------------
;-------------------------
; START
;-------------------------
;-------------------------
MainWnd.l = OpenWindow( 0,400,400,420,420,#PB_Window_SystemMenu,"OpenGL viewer" )
; Open GL windows
view1 = OpenGLview(1, 10, 10,200,200):
: DrawGLview_rotatespeed(1) = 3.33
: DrawGLview_circlespeed(1) = 0.02
view2 = OpenGLview(2,210, 10,200,200):
: DrawCube_RotateSpeedX(2) = 5.0 ; The speed of the rotation For the 3 axis
: DrawCube_RotateSpeedY(2) = 5.0
: DrawCube_RotateSpeedZ(2) = 5.0
;: DrawCube_ZoomFactor(2) = 0 ; Distance of the camera. Negative value = zoom back
view3 = OpenGLview(3, 10,210,200,200):
: DrawCube_RotateSpeedX(3) = 15.0 ; The speed of the rotation For the 3 axis
: DrawCube_RotateSpeedY(3) = 10.3
: DrawCube_RotateSpeedZ(3) = 12.12
;: DrawCube_ZoomFactor(3) = 0 ; Distance of the camera. Negative value = zoom back
view4 = OpenGLview(4,210,210,200,200):
: DrawGLview_rotatespeed(4) = 10.31
: DrawGLview_circlespeed(4) = 0.1
;While WindowEvent():Wend
Start_DrawGLview(1,view1)
Start_DrawCube(2,view2)
Start_DrawCube(3,view3)
Start_DrawGLview(4,view4)
Repeat
Select WaitWindowEvent():
Case #PB_EventCloseWindow
Stop_Threads():End
EndSelect
;Delay(1)
ForEver