Code: Select all
#SC_DragMove = $F012
;UseJPEGImageDecoder()
;LoadImage(0, "Geebee1000.jpg")
;imgw = ImageWidth(0)
;imgh = ImageHeight(0)
Global RollAxisX.f
Global RollAxisY.f
Global RollAxisZ.f
Global RotateSpeedX.f = 1.0
Global RotateSpeedY.f
Global RotateSpeedZ.f = 1.0
Global ZoomFactor.f = 1.0 ; Distance of the camera. Negative value = zoom back
Procedure DrawCube(Gadget)
SetGadgetAttribute(Gadget, #PB_OpenGL_SetContext, #True)
glPushMatrix_() ; Save the original Matrix coordinates
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, ZoomFactor) ; move it forward a bit
glRotatef_ (RollAxisX, 1.0, 0, 0) ; rotate around X axis
glRotatef_ (RollAxisY, 0, 1.0, 0) ; rotate around Y axis
glRotatef_ (RollAxisZ, 0, 0, 1.0) ; rotate around Z axis
RollAxisX + RotateSpeedX
RollAxisY + RotateSpeedY
RollAxisZ + RotateSpeedZ
; 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_()
SetGadgetAttribute(Gadget, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
Procedure SetupGL()
glMatrixMode_(#GL_PROJECTION)
gluPerspective_(30.0, 200/200, 1.0, 10.0)
; position viewer
glMatrixMode_(#GL_MODELVIEW)
glTranslatef_(0, 0, -5.0)
glEnable_(#GL_DEPTH_TEST) ; Enabled, it slowdown a lot the rendering. It's to be sure than the
; rendered objects are inside the z-buffer.
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.
glShadeModel_(#GL_SMOOTH)
EndProcedure
Procedure HandleError (Result, Text$)
If Result = 0
MessageRequester("Error", Text$, 0)
End
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 800,600, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ContainerGadget(10,0,0,800,600,#PB_Container_BorderLess)
ContainerGadget(20, -1000, -1000, 4000,4000,#PB_Container_BorderLess)
OpenGLGadget(0, 1000, 1000, 200, 200)
SetupGL()
OpenGLGadget(1, 1500, 1000, 300, 300)
SetupGL()
CloseGadgetList()
CloseGadgetList()
DisableGadget(10,1)
;DisableGadget(20,1)
;SetWindowColor(0,RGB(0,0,200))
;SetGadgetColor(0,#PB_Gadget_BackColor,RGB(0,200,0))
;SetGadgetColor(10,#PB_Gadget_BackColor,RGB(0,200,0))
AddWindowTimer(0, 1, 16)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Timer
If EventTimer() = 1
DrawCube(0)
DrawCube(1)
EndIf
Case #WM_LBUTTONDOWN
GetCursorPos_(p.POINT)
ScreenToClient_ (GadgetID(20), @p)
If ChildWindowFromPoint_(GadgetID(20),p\y << 32 + p\x) = GadgetID(0)
RemoveWindowTimer(0,1)
SetCursor_(LoadCursor_(0, #IDC_SIZEALL))
SendMessage_(GadgetID(0), #WM_SYSCOMMAND , #SC_DragMove,0)
AddWindowTimer(0, 1, 16)
ElseIf ChildWindowFromPoint_(GadgetID(20),p\y << 32 + p\x) = GadgetID(1)
RemoveWindowTimer(0,1)
SetCursor_(LoadCursor_(0, #IDC_SIZEALL))
SendMessage_(GadgetID(1), #WM_SYSCOMMAND , #SC_DragMove,0)
AddWindowTimer(0, 1, 16)
EndIf
EndSelect
Until Quit = 1
EndIf