⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openglext.ksh

📁 gtk_server的源代码
💻 KSH
字号:
#!/bin/ksh## Demo with gtkglext - April 2008, (c) PvE.##---------------------------------------------------------------------# Some constants#---------------------------------------------------------------------NULL="NULL"ESCAPE=65307# These hex values are retrieved from the GL header fileslet GL_DEPTH_BUFFER_BIT=16#100let GL_COLOR_BUFFER_BIT=16#4000let GL_LIGHT0=16#4000let GL_MODELVIEW=16#1700let GL_POSITION=16#1203let GL_AMBIENT=16#1200let GL_DIFFUSE=16#1201let GL_SPECULAR=16#1202let GL_SMOOTH=16#1D01let GL_DEPTH_TEST=16#0B71let GL_LIGHTING=16#0B50let GL_FRONT=16#0404let GL_AMBIENT_AND_DIFFUSE=16#1602# These are from the GtkGlExt enumerationslet GDK_GL_RGBA_TYPE=0let GDK_GL_MODE_RGB=0((GDK_GL_MODE_DOUBLE=1<<1))((GDK_GL_MODE_DEPTH=1<<4))# First message in ASCII characters: "OpenGL demo with Kornshell"set -A MSG1 79 112 101 110 71 76 32 100 101 109 111 32 119 105 116 104 32 75 111 114 110 115 104 101 108 108# Second message in ASCII characters: "Using GTK-server with GtkGlExt!"set -A MSG2 85 115 105 110 103 32 71 84 75 45 115 101 114 118 101 114 32 119 105 116 104 32 71 116 107 71 108 69 120 116 33#---------------------------------------------------------------------# Communication function; assignment function#---------------------------------------------------------------------function gtk { print -p $1; read -p GTK; }function define { $2 "$3"; eval $1=$GTK; }#---------------------------------------------------------------------# Draw bitmapped text on the screen, character by character#---------------------------------------------------------------------function bitmap_text{let NR=0while [[ $NR -lt ${#MSG1[@]} ]]do    gtk "glutBitmapCharacter $GLUT_BITMAP_HELVETICA_18 ${MSG1[$NR]}"    ((NR+=1))done}#---------------------------------------------------------------------# Draw stroked text on the screen, character by character#---------------------------------------------------------------------function stroke_text{let NR=0while [[ $NR -lt ${#MSG2[@]} ]]do    gtk "glutStrokeCharacter $GLUT_STROKE_ROMAN ${MSG2[$NR]}"    ((NR+=1))done}#---------------------------------------------------------------------# Draw and expose the picture## Note: colors in OpenGL are mostly defined as an array of floats.# Such an array cannot be passed to the GTK-server, therefore we pass # a binary structure which is Base64 encoded. To create a Base64# encoded float array structure, I used the following:## newlisp -e '(base64-enc (pack "fff" 1 1 0))'## In this example the float array {1.0 1.0 0.0} is shown in Base64 # and can be passed to the GTK-server. Of course the datatype for the # argument in the GL-function in the configfile should be set to# BASE64 also.## NewLisp can be obtained for free from http://www.newlisp.org#---------------------------------------------------------------------function expose{# Setup the drawing areadefine GLCONTEXT gtk "gtk_widget_get_gl_context $DA"define GLDRAWABLE gtk "gtk_widget_get_gl_window $DA"gtk "gdk_gl_drawable_gl_begin $GLDRAWABLE $GLCONTEXT"# Define clearing colorgtk "glClearColor 0.5 1 1 0"# Clear screen((FLAG=$GL_COLOR_BUFFER_BIT|$GL_DEPTH_BUFFER_BIT))gtk "glClear $FLAG"# Enable shading, depth and lightinggtk "glShadeModel $GL_SMOOTH"gtk "glEnable $GL_DEPTH_TEST"gtk "glEnable $GL_LIGHTING"gtk "glEnable $GL_LIGHT0"# Setup lightinggtk "glLightfv $GL_LIGHT0 $GL_POSITION AAAAQAAAAEAAAADBAAAAAA=="gtk "glLightfv $GL_LIGHT0 $GL_DIFFUSE AACAPwAAgD8AAIA/AACAPw=="gtk "glLightfv $GL_LIGHT0 $GL_AMBIENT mpkZPpqZGT6amRk+"gtk "glLightfv $GL_LIGHT0 $GL_SPECULAR AACAPwAAgD8AAIA/AACAPw=="# Setup reflected color of objectgtk "glMaterialfv $GL_FRONT $GL_AMBIENT_AND_DIFFUSE zczMPTMzMz/NzMw9AAAAPw=="# Make sure we see the modelgtk "glMatrixMode $GL_MODELVIEW"# Save current matrixgtk "glPushMatrix"# Rotategtk "glRotatef $ROTX 0 1 0"gtk "glRotatef $ROTY 1 0 0"# Dump rotated imagegtk "glutSolidTeapot $SIZE"# Undo the last rotationgtk "glLoadIdentity"# Setup reflected color of fontgtk "glMaterialfv $GL_FRONT $GL_AMBIENT_AND_DIFFUSE AACAP83MzD4AAIA/AAAAAA=="# Determine position of bitmapped textgtk "glRasterPos2f 0 -0.8"# Draw some bitmapped textbitmap_text# Setup reflected color of fontgtk "glMaterialfv $GL_FRONT $GL_AMBIENT_AND_DIFFUSE AAAAAAAAAAAAAIA/AAAAAA=="# Determine position of STROKED text -> drawed so translategtk "glTranslatef -0.9 0.8 0.0"# Setup scaling -> stroked characters are large, make smallergtk "glScalef 0.0005 0.0006 0"# Draw some stroked textstroke_text# Now put back the matrixgtk "glPopMatrix"# Now swap buffers and drawgtk "gdk_gl_drawable_swap_buffers $GLDRAWABLE"gtk "gdk_gl_drawable_gl_end $GLDRAWABLE"}#---------------------------------------------------------------------# Main program#---------------------------------------------------------------------# Start GTK-server in STDIN modegtk-server -stdin |&# Check availability of GtkGlExt and GLUTdefine AVAIL gtk "gtk_server_require libgtkglext-x11-1.0.so"if [[ $AVAIL != "ok" ]]then    echo "Install the GtkGlExt libraries from gtkglext.sourceforge.net first, and run this demo again."    gtk "gtk_server_exit"    exitfidefine AVAIL gtk "gtk_server_require libglut.so.3"if [[ $AVAIL != "ok" ]]then    echo "Install the GLUT libraries from freeglut.sourceforge.net first, and run this demo again."    gtk "gtk_server_exit"    exitfi# Define GUIgtk "gtk_init $NULL $NULL"gtk "gtk_gl_init $NULL $NULL"# Windowdefine WINDOW gtk "gtk_window_new 0"gtk "gtk_window_set_default_size $WINDOW 640 480"gtk "gtk_window_set_title $WINDOW 'This is a teapot demo with Kornshell'"gtk "gtk_window_set_position $WINDOW 1"# Signal every 100 msecsgtk "gtk_server_connect $WINDOW show idle"gtk "gtk_server_timeout 75 $WINDOW show"gtk "gtk_server_connect $WINDOW key-press-event key-press-event"# Drawing areadefine DA gtk "gtk_drawing_area_new"gtk "gtk_container_add $WINDOW $DA"((FLAG=$GDK_GL_MODE_RGB|$GDK_GL_MODE_DOUBLE|$GDK_GL_MODE_DEPTH))define GLCONFIG gtk "gdk_gl_config_new_by_mode $FLAG"gtk "gtk_widget_set_gl_capability $DA $GLCONFIG $NULL 1 $GDK_GL_RGBA_TYPE"gtk "gtk_server_connect $DA expose-event expose"gtk "gtk_widget_show_all $WINDOW"# Initalize GLUTgtk "glutInit 1 ' '"# Initialize variablesEVENT=0ROTX=0ROTY=330# size of teapotSIZE=0.5define GLUT_BITMAP_HELVETICA_18 gtk "glutBitmapHelvetica18"define GLUT_STROKE_ROMAN gtk "glutStrokeRoman"# Mainloopuntil [[ $EVENT = $WINDOW || $KEY = $ESCAPE ]]do    define EVENT gtk "gtk_server_callback wait"    # Rotate    ((ROTX+=3))    ((ROTY+=2))    if [[ $ROTX -gt 359 ]]    then	ROTX=0    fi    if [[ $ROTX -lt 0 ]]    then	ROTX=360    fi    if [[ $ROTY -gt 359 ]]    then	ROTY=0    fi    if [[ $ROTY -lt 0 ]]    then	ROTY=360    fi    # Check events    case $EVENT in	"idle")	    expose	    ;;	"expose")	    expose	    ;;	"key-press-event")	    define KEY gtk "gtk_server_key"	    ;;    esacdone# Exit GTKgtk "gtk_server_exit"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -