Code: Select all
Macro fillv(V,a,b,c,d)
v(0) = a
v(1) = b
v(2) = c
v(3) = d
EndMacro
Declare glarea_draw (*widget.GtkWidget,*event.GdkEventExpose)
Procedure glarea_init (*widget.GtkWidget)
If gtk_gl_area_make_current(*widget)
Global Dim light0_pos.f(4)
fillv(light0_pos,-50.0, 50.0, 0.0, 0.0);
Global Dim light0_color.f(4)
fillv(light0_color, 0.6, 0.6, 0.6, 1.0); /* white light */
Global Dim light1_pos.f(4)
fillv(light1_pos,50.0, 50.0, 0.0, 0.0);
Global Dim light1_color.f(4)
fillv(light1_color,0.4, 0.4, 1.0, 1.0); /* cold blue light */
glEnable(#GL_DEPTH_TEST);
glEnable(#GL_CULL_FACE)
;/* speedups */
glEnable(#GL_DITHER);
glShadeModel(#GL_SMOOTH);
glHint(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_FASTEST);
glHint(#GL_POLYGON_SMOOTH_HINT, #GL_FASTEST);
;/* light */
glLightfv(#GL_LIGHT0, #GL_POSITION, @light0_pos);
glLightfv(#GL_LIGHT0, #GL_DIFFUSE, @light0_color);
glLightfv(#GL_LIGHT1, #GL_POSITION, @light1_pos);
glLightfv(#GL_LIGHT1, #GL_DIFFUSE, @light1_color);
glEnable(#GL_LIGHT0);
glEnable(#GL_LIGHT1);
glEnable(#GL_LIGHTING);
glColorMaterial(#GL_FRONT_AND_BACK,#GL_AMBIENT_AND_DIFFUSE);
glEnable(#GL_COLOR_MATERIAL);
ginit = 1
EndIf
ProcedureReturn 1
EndProcedure
Procedure glarea_reshape(*widget.GtkWidget,*event.GdkEventConfigure)
w =*widget\parent\allocation\width;
h = *widget\parent\allocation\height;
If gtk_gl_area_make_current(*widget)
glMatrixMode(#GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, w/h, 0.1, 1000.0)
glMatrixMode(#GL_MODELVIEW)
glViewport(0,0, w,h);
Else
Debug "fail"
EndIf
ProcedureReturn 1;
EndProcedure
Procedure glarea_draw (*widget.GtkWidget,*event.GdkEventExpose)
Static rot.f
Static shp
If gtk_gl_area_make_current(*widget)
rot+0.1
glClear(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glClearColor(0,0,0,1);
glLoadIdentity(); // Reset The View
glTranslatef(0,0,-5);
glRotatef(rot,0.0,1.0,1.0); // Rotate The Pyramid On It's Y Axis
glbegin(#GL_TRIANGLES)
glColor3f(255,0.0,0.0); // Red
glVertex3f( 0.0,1.0,0.0); // Top Of Triangle (Front)
glColor3f(0.0,255,0.0); // Green
glVertex3f(-1.0,-1.0, 1.0); // Left Of Triangle (Front)
glColor3f(0.0,0.0,255); // Blue
glVertex3f( 1.0,-1.0, 1.0); // Right Of Triangle (Front)
glColor3f(255,0.0,0.0); // Red
glVertex3f( 0.0, 1.0, 0.0); // Top Of Triangle (Right)
glColor3f(0.0,0.0,255); // Blue
glVertex3f( 1.0,-1.0, 1.0); // Left Of Triangle (Right)
glColor3f(0.0,255,0.0); // Green
glVertex3f( 1.0,-1.0, -1.0); // Right Of Triangle (Right)
glColor3f(255,0.0,0.0); // Red
glVertex3f( 0.0, 1.0,0.0); // Top Of Triangle (Back)
glColor3f(0.0,255,0.0); // Green
glVertex3f( 1.0,-1.0, -1.0); // Left Of Triangle (Back)
glColor3f(0.0,0.0,255); // Blue
glVertex3f(-1.0,-1.0, -1.0); // Right Of Triangle (Back)
glColor3f(255,0.0,0.0); // Red
glVertex3f( 0.0, 1.0, 0.0); // Top Of Triangle (Left)
glColor3f(0.0,0.0,255); // Blue
glVertex3f(-1.0,-1.0,-1.0); // Left Of Triangle (Left)
glColor3f(0.0,255,0.0); // Green
glVertex3f(-1.0,-1.0, 1.0); // Right Of Triangle (Left)
glEnd(); // Done Drawing The Pyramid
gtk_gl_area_swap_buffers(*widget);
;Debug "draw"
Else
Debug "fail"
EndIf
ProcedureReturn 1
EndProcedure
Global glarea ,ctg,win
Procedure Ireshape(*widget.GtkWidget,*allocation.GtkAllocation,*vData)
gtk_widget_set_size_request_(*vdata,*allocation\width,*allocation\height)
EndProcedure
Procedure glarea_Create(x,y,w,h)
Protected tglarea,ctg
Dim ats(4) : ats(0)=#GDK_GL_RGBA : ats(1)=#GDK_GL_DOUBLEBUFFER : ats(2) = #GDK_GL_DEPTH_SIZE
ats(3) = 1 : ats(4) = #GDK_NONE
ctg = ContainerGadget(#PB_Any,x,y,w,h)
tglarea = gtk_gl_area_new(@ats(0))
SetGadgetData(ctg,tglarea)
g_signal_connect_(GadgetID(ctg), "size-allocate",@Ireshape(),tglarea)
gtk_widget_set_events_(tglarea,#GDK_EXPOSURE_MASK|#GDK_BUTTON_PRESS_MASK|#GDK_BUTTON_RELEASE_MASK|#GDK_POINTER_MOTION_MASK|#GDK_POINTER_MOTION_HINT_MASK);
g_signal_connect_(tglarea,"realize",@glarea_init(),0);
g_signal_connect_(tglarea,"expose_event",@glarea_draw(),0);
g_signal_connect_(tglarea, "configure_event",@glarea_reshape(),0)
gtk_widget_set_usize_(tglarea,w,h);
gtk_container_add_(GadgetID(ctg), tglarea); ;need to attach it to something
CloseGadgetList()
gtk_widget_show_(tglarea);
ProcedureReturn ctg
EndProcedure
If OpenWindow(#PB_Any, 0, 0, 800, 600, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWindowCallback(@WinManCallBack(),0)
glarea1 = glarea_Create(0,0,0,0)
glarea2 = glarea_Create(0,0,0,0)
glarea3= glarea_Create(0,0,0,0)
glarea4 = glarea_Create(0,0,0,0)
#Separateur1 = 4
#Separateur2 = 5
#Separateur3 = 6
SplitterGadget(#Separateur1, 0, 0, 0, 0, glarea1, glarea2, #PB_Splitter_Separator)
SplitterGadget(#Separateur2, 0, 0, 0, 0, glarea3, glarea4, #PB_Splitter_Separator)
SplitterGadget(#Separateur3, 5, 5, 790, 590, #Separateur1, #Separateur2, #PB_Splitter_Separator|#PB_Splitter_Vertical)
Repeat
glarea_draw(GetGadgetData(glarea1),0)
glarea_draw(GetGadgetData(glarea2),0)
glarea_draw(GetGadgetData(glarea3),0)
glarea_draw(GetGadgetData(glarea4),0)
EventID = WaitWindowEvent(10)
Select EventID
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow


