mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			194 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/local/bin/python
 | |
| 
 | |
| # *** 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()
 | |
| 
 | |
| #
 | |
| # makeobj : the contructor of the object
 | |
| #
 | |
| 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  ()
 | 
