| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # *** This only works correctly on a 24 bit-plane machine. *** | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # A simple Python program that tests the some parts of the | 
					
						
							|  |  |  | # GL library. It shows the speed that can be obtained when | 
					
						
							|  |  |  | # doing simple graphics. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # The bottleneck in this program is NOT Python but the graphics | 
					
						
							|  |  |  | # engine; i.e Python can feed the graphics pipeline fast enough | 
					
						
							|  |  |  | # on the 4D/25G. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This program show 3 kites flying around the screen. It uses | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # 	* bgnpolygon, endpolygon | 
					
						
							|  |  |  | # 	* v3, n3 | 
					
						
							|  |  |  | # 	* lmdef, lmbind | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Usage : | 
					
						
							|  |  |  | #  | 
					
						
							|  |  |  | # 	ESC 	-> exit program | 
					
						
							|  |  |  | # 	MOUSE3 	-> freeze toggle | 
					
						
							|  |  |  | # 	MOUSE2 	-> one step (use this in freeze state) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from GL import * | 
					
						
							|  |  |  | from gl import * | 
					
						
							|  |  |  | import DEVICE | 
					
						
							|  |  |  | from math import * | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # viewobj : sets the rotation, translation and scaling | 
					
						
							|  |  |  | # set appropiate material, call drawobject() | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def viewobj (r, s, t, mat) : | 
					
						
							|  |  |  | 	pushmatrix() | 
					
						
							|  |  |  | 	rot (r * 10.0, 'X') | 
					
						
							|  |  |  | 	rot (r * 10.0, 'Y') | 
					
						
							|  |  |  | 	rot (r * 10.0, 'Z') | 
					
						
							|  |  |  | 	scale (s[0], s[1], s[2]) | 
					
						
							|  |  |  | 	translate (t[0], t[1], t[2]) | 
					
						
							|  |  |  | 	lmbind(MATERIAL, mat) | 
					
						
							|  |  |  | 	drawobject() | 
					
						
							|  |  |  | 	popmatrix() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2000-07-16 12:04:32 +00:00
										 |  |  | # makeobj : the constructor of the object | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | # | 
					
						
							|  |  |  | def mkobj () : | 
					
						
							|  |  |  | 	v0 = (-5.0 ,0.0, 0.0) | 
					
						
							|  |  |  | 	v1 = (0.0 ,5.0, 0.0) | 
					
						
							|  |  |  | 	v2 = (5.0 ,0.0, 0.0) | 
					
						
							|  |  |  | 	v3 = (0.0 ,2.0, 0.0) | 
					
						
							|  |  |  | 	n0 = (sqrt(2.0)/2.0, sqrt(2.0)/2.0, 0.0) | 
					
						
							|  |  |  | 	vn = ((v0, n0), (v1, n0), (v2, n0), (v3, n0)) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	return vn | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # the object itself as an array of vertices and normals | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | kite = mkobj () | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # drawobject : draw a triangle. with bgnpolygon | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def drawobject () : | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	vnarray (kite) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # identity matrix | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | idmat=[1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # the rgb-value of light-blue  | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | LightBlue = (43,169,255) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # the different materials. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | m1=[SPECULAR,0.0,0.0,0.6,DIFFUSE,0.0,0.0,0.8,SHININESS,20.0,LMNULL] | 
					
						
							|  |  |  | m2=[SPECULAR,0.8,0.0,0.1,DIFFUSE,0.8,0.0,0.3,SHININESS,120.0,LMNULL] | 
					
						
							|  |  |  | m3=[SPECULAR,0.0,1.0,0.0,DIFFUSE,0.0,0.6,0.0,SHININESS,120.0,LMNULL] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # lightsources | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | light1 = [LCOLOR,1.0,1.0,1.0,POSITION,15.0,15.0,0.0,1.0,LMNULL] | 
					
						
							|  |  |  | light2 = [LCOLOR,1.0,1.0,1.0,POSITION,-15.0,15.0,0.0,1.0,LMNULL] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # the lightmodel | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | model = [AMBIENT,0.2,0.2,0.2,LMNULL] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # initgl : opens the window, configures the pipeline to 2buf and zbuf, | 
					
						
							|  |  |  | # sets the viewing, defines and binds the materials | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def initgl () : | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# open window | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	foreground () | 
					
						
							|  |  |  | 	keepaspect (1, 1) | 
					
						
							|  |  |  | 	prefposition (100, 500, 100, 500) | 
					
						
							|  |  |  | 	w = winopen ('PYTHON lights') | 
					
						
							|  |  |  | 	keepaspect (1, 1) | 
					
						
							|  |  |  | 	winconstraints() | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# configure pipeline (zbuf, 2buf, GOURAUD and RGBmode) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	zbuffer (1) | 
					
						
							|  |  |  | 	doublebuffer () | 
					
						
							|  |  |  | 	shademodel (GOURAUD) | 
					
						
							|  |  |  | 	RGBmode () | 
					
						
							|  |  |  | 	gconfig () | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# define and bind materials (set perspective BEFORE loadmat !) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	mmode(MVIEWING) | 
					
						
							|  |  |  | 	perspective (900, 1.0, 1.0, 20.0) | 
					
						
							|  |  |  | 	loadmatrix(idmat) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 1, m1) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 2, m2) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 3, m3) | 
					
						
							|  |  |  | 	lmdef(DEFLIGHT, 1, light1) | 
					
						
							|  |  |  | 	lmdef(DEFLIGHT, 2, light2) | 
					
						
							|  |  |  | 	lmdef(DEFLMODEL, 1, model) | 
					
						
							|  |  |  | 	lmbind(LIGHT0,1) | 
					
						
							|  |  |  | 	lmbind(LIGHT1,2) | 
					
						
							|  |  |  | 	lmbind(LMODEL,1) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# set viewing | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	lookat (0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0) | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# ask for the REDRAW and ESCKEY events | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	qdevice(DEVICE.MOUSE3) | 
					
						
							|  |  |  | 	qdevice(DEVICE.MOUSE2) | 
					
						
							|  |  |  | 	qdevice(DEVICE.REDRAW) | 
					
						
							|  |  |  | 	qdevice(DEVICE.ESCKEY) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # GoForIT : use 2buf to redraw the object 2n times. index i is used as  | 
					
						
							|  |  |  | # the (smoothly changing) rotation angle | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def GoForIt(i) : | 
					
						
							|  |  |  | 	freeze = 1 | 
					
						
							|  |  |  | 	while 1 : | 
					
						
							|  |  |  | 		if freeze <> 0 : | 
					
						
							|  |  |  | 			i = i + 1 | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		# clear z-buffer and clear background to light-blue | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		zclear() | 
					
						
							|  |  |  | 		c3i (LightBlue) | 
					
						
							|  |  |  | 		clear() | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		# draw the 3 traiangles scaled above each other. | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		viewobj(float(i),[1.0,1.0,1.0],[1.0,1.0,1.0],1) | 
					
						
							|  |  |  | 		viewobj(float(i),[0.75,0.75,0.75],[0.0,2.0,2.0],2) | 
					
						
							|  |  |  | 		viewobj(float(i),[0.5,0.5,0.5],[0.0,4.0,4.0],3) | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		swapbuffers() | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		if qtest() <> 0 : | 
					
						
							|  |  |  | 			dev, val = qread() | 
					
						
							|  |  |  | 			if dev == DEVICE.ESCKEY : | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 			elif dev == DEVICE.REDRAW : | 
					
						
							|  |  |  | 				reshapeviewport () | 
					
						
							|  |  |  | 			elif dev == DEVICE.MOUSE3 and val <> 0 : | 
					
						
							|  |  |  | 				freeze = 1 - freeze | 
					
						
							|  |  |  | 			elif dev == DEVICE.MOUSE2 and val <> 0 : | 
					
						
							|  |  |  | 				i = i + 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # the main program | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def main () : | 
					
						
							|  |  |  | 	initgl () | 
					
						
							|  |  |  | 	GoForIt (0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # exec main | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | main  () |