📄 openglext.sb
字号:
#!/usr/bin/scribaREMREM Demo with gtkglext - May - August 2008, (c) PvE.REMREM Run with the free Scriptbasic interpreter from http://www.scriptbasic.comREMREM ---------------------------------------------------------------------REM Some constantsREM ---------------------------------------------------------------------REM Get GTK definitionsIMPORT gtk.basESCAPE = 65307REM These hex values are retrieved from the GL header filesGL_DEPTH_BUFFER_BIT=0x100GL_COLOR_BUFFER_BIT=0x4000GL_LIGHT0=0x4000GL_MODELVIEW=0x1700GL_POSITION=0x1203GL_AMBIENT=0x1200GL_DIFFUSE=0x1201GL_SPECULAR=0x1202GL_SMOOTH=0x1D01GL_DEPTH_TEST=0x0B71GL_LIGHTING=0x0B50GL_FRONT=0x0404GL_AMBIENT_AND_DIFFUSE=0x1602REM These are from the GtkGlExt enumerationsGDK_GL_RGBA_TYPE=0GDK_GL_MODE_RGB=0GDK_GL_MODE_DOUBLE=2GDK_GL_MODE_DEPTH=16REM ---------------------------------------------------------------------REM Draw bitmapped text on the screen, character by characterREM ---------------------------------------------------------------------FUNCTION bitmap_text(txt$)FOR idx = 1 TO LEN(txt$) glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, ASC(MID(txt$, idx, 1)))NEXT idxEND FUNCTIONREM ---------------------------------------------------------------------REM Draw stroked text on the screen, character by characterREM ---------------------------------------------------------------------FUNCTION stroke_text(txt$)FOR idx = 1 TO LEN(txt$) glutStrokeCharacter(GLUT_STROKE_ROMAN, ASC(MID(txt$, idx, 1)))NEXT idxEND FUNCTIONREM ---------------------------------------------------------------------REM Draw and expose the pictureREMREM Note: colors in OpenGL are mostly defined as an array of floats.REM Such an array cannot be passed to the GTK-server, therefore we pass REM a binary structure which is Base64 encoded. To create a Base64REM encoded float array structure, I used the following:REMREM newlisp -e '(base64-enc (pack "fff" 1 1 0))'REMREM In this example the float array {1.0 1.0 0.0} is shown in Base64 REM and can be passed to the GTK-server. Of course the datatype for the REM argument in the GL-function in the configfile should be set toREM BASE64 also.REMREM NewLisp can be obtained for free from http://www.newlisp.orgREM---------------------------------------------------------------------FUNCTION exposeREM Setup the drawing areaGLCONTEXT = gtk_widget_get_gl_context(DA)GLDRAWABLE = gtk_widget_get_gl_window(DA)gdk_gl_drawable_gl_begin(GLDRAWABLE, GLCONTEXT)REM Define clearing colorglClearColor(0.5, 1, 1, 0)REM Clear screenFLAG = GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BITglClear(FLAG)REM Enable shading, depth and lightingglShadeModel(GL_SMOOTH)glEnable(GL_DEPTH_TEST)glEnable(GL_LIGHTING)glEnable(GL_LIGHT0)REM Setup lightingglLightfv(GL_LIGHT0, GL_POSITION, "AAAAQAAAAEAAAADBAAAAAA==")glLightfv(GL_LIGHT0, GL_DIFFUSE, "AACAPwAAgD8AAIA/AACAPw==")glLightfv(GL_LIGHT0, GL_AMBIENT, "mpkZPpqZGT6amRk+")glLightfv(GL_LIGHT0, GL_SPECULAR, "AACAPwAAgD8AAIA/AACAPw==")REM Setup reflected color of objectglMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, "zczMPTMzMz/NzMw9AAAAPw==")REM Make sure we see the modelglMatrixMode(GL_MODELVIEW)REM Save current matrixglPushMatrix()REM RotateglRotatef(ROTX, 0, 1, 0)glRotatef(ROTY, 1, 0, 0)REM Dump rotated imageglutSolidTeapot(SIZE)REM Undo the last rotationglLoadIdentity()REM Setup reflected color of fontglMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, "AACAP83MzD4AAIA/AAAAAA==")REM Determine position of bitmapped textglRasterPos2f(0, -0.8)REM Draw some bitmapped textbitmap_text("OpenGL demo with Scriptbasic")REM Setup reflected color of fontglMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, "AAAAAAAAAAAAAIA/AAAAAA==")REM Determine position of STROKED text -> drawed so translateglTranslatef(-0.9, 0.8, 0.0)REM Setup scaling -> stroked characters are large, make smallerglScalef(0.0005, 0.0006, 0)REM Draw some stroked textstroke_text("Using GTK-server with GtkGlExt!")REM Now put back the matrixglPopMatrix()REM Now swap buffers and drawgdk_gl_drawable_swap_buffers(GLDRAWABLE)gdk_gl_drawable_gl_end(GLDRAWABLE)END FUNCTIONREM ---------------------------------------------------------------------REM Main programREM ---------------------------------------------------------------------REM gtk_server_cfg("-log=/tmp/log.txt")REM Check availability of GtkGlExt and GLUTAVAIL = gtk_server_require("libgtkglext-x11-1.0.so")IF AVAIL <> "ok" THEN PRINT "Install the GtkGlExt libraries from gtkglext.sourceforge.net first, and run this demo again.\n" gtk_server_exit() ENDEND IFAVAIL = gtk_server_require("libglut.so.3")IF AVAIL <> "ok" THEN PRINT "Install the GLUT libraries from freeglut.sourceforge.net first, and run this demo again.\n" gtk_server_exit() ENDEND IFREM Initialize libsgtk_init("NULL", "NULL")gtk_gl_init("NULL", "NULL")glutInit(1, "' '")REM Windowwin = gtk_window_new(0)gtk_window_set_default_size(win, 640, 480)gtk_window_set_title(win, "This is a teapot demo with ScriptBasic")gtk_window_set_position(win, 1)REM Signal every 100 msecsgtk_server_connect(win, "show", "idle")gtk_server_timeout(75, win, "show")gtk_server_connect(win, "key-press-event", "key-press-event")REM Drawing areaDA = gtk_drawing_area_new()gtk_container_add(win, DA)FLAG = GDK_GL_MODE_RGB OR GDK_GL_MODE_DOUBLE OR GDK_GL_MODE_DEPTHGLCONFIG = gdk_gl_config_new_by_mode(FLAG)gtk_widget_set_gl_capability(DA, GLCONFIG, "NULL", 1, GDK_GL_RGBA_TYPE)gtk_server_connect(DA, "expose-event", "expose")gtk_widget_show_all(win)REM Initialize variablesEVENT=0ROTX=0ROTY=330REM size of teapotSIZE=0.5GLUT_BITMAP_HELVETICA_18 = glutBitmapHelvetica18()GLUT_STROKE_ROMAN = glutStrokeRoman()REM MainloopREPEAT EVENT = gtk_server_callback("wait") REM Rotate ROTX = ROTX + 3 ROTY = ROTY + 2 IF ROTX > 359 THEN ROTX=0 END IF IF ROTX < 0 THEN ROTX=360 END IF IF ROTY > 359 THEN ROTY=0 END IF IF ROTY < 0 THEN ROTY=360 END IF REM Check events IF EVENT = "idle" THEN expose() END IF IF EVENT = "expose" THEN expose() END IF IF EVENT = "key-press-event" THEN keyb = gtk_server_key() END IFUNTIL EVENT = win OR keyb = ESCAPEREM Exit GTKgtk_server_exit()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -