| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | #! /usr/local/bin/python | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | # Simulate the artwork in the hall. | 
					
						
							|  |  |  | # Jack Jansen, Feb 91. | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | from gl import * | 
					
						
							|  |  |  | from GL import * | 
					
						
							|  |  |  | from math import * | 
					
						
							|  |  |  | from DEVICE import * | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import __main__ | 
					
						
							|  |  |  | main_dict = __main__.__dict__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SPOTDIRECTION = 103 | 
					
						
							|  |  |  | SPOTLIGHT = 104 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Make a cylinder paralel with the Z axis with center (X,Y,0) | 
					
						
							|  |  |  | # and radius 1 | 
					
						
							|  |  |  | def mkcyl(nslice, nparts, docircle): | 
					
						
							|  |  |  | 	cyl = [] | 
					
						
							|  |  |  | 	step = 2.0 / float(nslice) | 
					
						
							|  |  |  | 	z = -1.0 | 
					
						
							|  |  |  | 	for i in range(nslice): | 
					
						
							|  |  |  | 	    cyl.append(mkslice(z, z+step, nparts, docircle)) | 
					
						
							|  |  |  | 	    z = z + step | 
					
						
							|  |  |  | 	return drawcylinder(cyl) | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Make one part of a cylinder | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def mkslice(z1, z2, nparts, docircle): | 
					
						
							|  |  |  | 	if docircle: | 
					
						
							|  |  |  | 	    w1 = z1 | 
					
						
							|  |  |  | 	    w2 = z2 | 
					
						
							|  |  |  | 	    w1 = sqrt(1.0-w1*w1) | 
					
						
							|  |  |  | 	    w2 = sqrt(1.0-w2*w2) | 
					
						
							|  |  |  | 	    normalz = 1.0 | 
					
						
							|  |  |  | 	else: | 
					
						
							|  |  |  | 	    w1 = 1.0 | 
					
						
							|  |  |  | 	    w2 = 1.0 | 
					
						
							|  |  |  | 	    normalz = 0.0 | 
					
						
							|  |  |  | 	slice = [] | 
					
						
							|  |  |  | 	step = (2.0*pi)/float(nparts) | 
					
						
							|  |  |  | 	angle = 0.0 | 
					
						
							|  |  |  | 	for i in range(nparts+1): | 
					
						
							|  |  |  | 	    vx = cos(angle) | 
					
						
							|  |  |  | 	    vy = sin(angle) | 
					
						
							|  |  |  | 	    slice.append( ((vx*w1,vy*w1,z1), (vx*w1, vy*w1, z1*normalz)) ) | 
					
						
							|  |  |  | 	    slice.append( ((vx*w2,vy*w2,z2), (vx*w2, vy*w2, z2*normalz)) ) | 
					
						
							|  |  |  | 	    angle = angle + step | 
					
						
							|  |  |  | 	return slice | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Drawcylinder : draw the cylinder | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | class struct(): pass | 
					
						
							|  |  |  | curobj = struct() | 
					
						
							|  |  |  | curobj.curobj = 1 | 
					
						
							|  |  |  | def drawcylinder(cyl): | 
					
						
							|  |  |  | 	obj = curobj.curobj | 
					
						
							|  |  |  | 	curobj.curobj = curobj.curobj+1 | 
					
						
							|  |  |  | 	makeobj(obj) | 
					
						
							|  |  |  | 	for slice in cyl: | 
					
						
							|  |  |  | 	    bgntmesh() | 
					
						
							|  |  |  | 	    vnarray(slice) | 
					
						
							|  |  |  | 	    endtmesh() | 
					
						
							|  |  |  | 	closeobj() | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def drawnormals(cyl): | 
					
						
							|  |  |  | 	for slice in cyl: | 
					
						
							|  |  |  | 	    for triang in slice: | 
					
						
							|  |  |  | 		bgnline() | 
					
						
							|  |  |  | 		v3f(triang[0]) | 
					
						
							|  |  |  | 		v3f(triang[0][0] + triang[1][0], triang[0][1] + triang[1][1], triang[0][2] + triang[1][2]) | 
					
						
							|  |  |  | 		endline() | 
					
						
							|  |  |  | def drawfloors(): | 
					
						
							|  |  |  | 	obj = curobj.curobj | 
					
						
							|  |  |  | 	curobj.curobj = curobj.curobj+1 | 
					
						
							|  |  |  | 	makeobj(obj) | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	v3i(4,6,-6) | 
					
						
							|  |  |  | 	v3i(-6,6,-6) | 
					
						
							|  |  |  | 	v3i(-6,-6,-6) | 
					
						
							|  |  |  | 	v3i(4,-6,-6) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 	for floor in range(3): | 
					
						
							|  |  |  | 	    pos = -1 + 5*floor | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(4,4,pos) | 
					
						
							|  |  |  | 	    v3i(-6,4,pos) | 
					
						
							|  |  |  | 	    v3i(-6,6,pos) | 
					
						
							|  |  |  | 	    v3i(4,6,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(-4,4,pos) | 
					
						
							|  |  |  | 	    v3i(-4,-4,pos) | 
					
						
							|  |  |  | 	    v3i(-6,-4,pos) | 
					
						
							|  |  |  | 	    v3i(-6,4,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(-6,-4,pos) | 
					
						
							|  |  |  | 	    v3i(-6,-6,pos) | 
					
						
							|  |  |  | 	    v3i(4,-6,pos) | 
					
						
							|  |  |  | 	    v3i(4,-4,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	closeobj() | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | def drawdoors(): | 
					
						
							|  |  |  | 	obj = curobj.curobj | 
					
						
							|  |  |  | 	curobj.curobj = curobj.curobj+1 | 
					
						
							|  |  |  | 	makeobj(obj) | 
					
						
							|  |  |  | 	for floor in range(3): | 
					
						
							|  |  |  | 	    pos = -1+5*floor | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(-2,6,pos) | 
					
						
							|  |  |  | 	    v3i(-2,6,pos+3) | 
					
						
							|  |  |  | 	    v3i(0,6,pos+3) | 
					
						
							|  |  |  | 	    v3i(0,6,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	closeobj() | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | def drawrailing(): | 
					
						
							|  |  |  | 	obj = curobj.curobj | 
					
						
							|  |  |  | 	curobj.curobj = curobj.curobj+1 | 
					
						
							|  |  |  | 	makeobj(obj) | 
					
						
							|  |  |  | 	for floor in range(3): | 
					
						
							|  |  |  | 	    pos = -1 + 5*floor | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(4,4,pos) | 
					
						
							|  |  |  | 	    v3i(4,4,pos-1) | 
					
						
							|  |  |  | 	    v3i(-4,4,pos-1) | 
					
						
							|  |  |  | 	    v3i(-4,4,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(-4,4,pos) | 
					
						
							|  |  |  | 	    v3i(-4,4,pos-1) | 
					
						
							|  |  |  | 	    v3i(-4,-4,pos-1) | 
					
						
							|  |  |  | 	    v3i(-4,-4,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	    bgnpolygon() | 
					
						
							|  |  |  | 	    v3i(-4,-4,pos) | 
					
						
							|  |  |  | 	    v3i(-4,-4,pos-1) | 
					
						
							|  |  |  | 	    v3i(4,-4,pos-1) | 
					
						
							|  |  |  | 	    v3i(4,-4,pos) | 
					
						
							|  |  |  | 	    endpolygon() | 
					
						
							|  |  |  | 	closeobj() | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | def drawwalls(): | 
					
						
							|  |  |  | 	obj = curobj.curobj | 
					
						
							|  |  |  | 	curobj.curobj = curobj.curobj+1 | 
					
						
							|  |  |  | 	makeobj(obj) | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	v3i(4,6,-6) | 
					
						
							|  |  |  | 	v3i(4,6,18) | 
					
						
							|  |  |  | 	v3i(-6,6,18) | 
					
						
							|  |  |  | 	v3i(-6,6,-6) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	v3i(-6,6,-6) | 
					
						
							|  |  |  | 	v3i(-6,6,18) | 
					
						
							|  |  |  | 	v3i(-6,-6,18) | 
					
						
							|  |  |  | 	v3i(-6,-6,-6) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	v3i(-6,-6,-6) | 
					
						
							|  |  |  | 	v3i(-6,-6,18) | 
					
						
							|  |  |  | 	v3i(4,-6,18) | 
					
						
							|  |  |  | 	v3i(4,-6,-6) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 	bgnpolygon() | 
					
						
							|  |  |  | 	v3i(4,-6,-6) | 
					
						
							|  |  |  | 	v3i(4,-6,18) | 
					
						
							|  |  |  | 	v3i(4,4,18) | 
					
						
							|  |  |  | 	v3i(4,4,-6) | 
					
						
							|  |  |  | 	endpolygon() | 
					
						
							|  |  |  | 	closeobj() | 
					
						
							|  |  |  | 	return obj | 
					
						
							|  |  |  | def axis(): | 
					
						
							|  |  |  | 	bgnline() | 
					
						
							|  |  |  | 	cpack(0xff0000) | 
					
						
							|  |  |  | 	v3i(-1,0,0) | 
					
						
							|  |  |  | 	v3i(1,0,0) | 
					
						
							|  |  |  | 	v3f(1.0, 0.1, 0.1) | 
					
						
							|  |  |  | 	endline() | 
					
						
							|  |  |  | 	bgnline() | 
					
						
							|  |  |  | 	cpack(0xff00) | 
					
						
							|  |  |  | 	v3i(0,-1,0) | 
					
						
							|  |  |  | 	v3i(0,1,0) | 
					
						
							|  |  |  | 	v3f(0.1, 1.0, 0.1) | 
					
						
							|  |  |  | 	endline() | 
					
						
							|  |  |  | 	bgnline() | 
					
						
							|  |  |  | 	cpack(0xff) | 
					
						
							|  |  |  | 	v3i(0,0,-1) | 
					
						
							|  |  |  | 	v3i(0,0,1) | 
					
						
							|  |  |  | 	v3f(0.1,0.1,1.0) | 
					
						
							|  |  |  | 	endline() | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | green_velvet = [ DIFFUSE, 0.05, 0.4, 0.05, LMNULL] | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | silver = [ DIFFUSE, 0.3, 0.3, 0.3, SPECULAR, 0.9, 0.9, 0.95, \ | 
					
						
							|  |  |  | 	SHININESS, 40.0, LMNULL] | 
					
						
							|  |  |  | floormat = [ AMBIENT, 0.5, 0.25, 0.15, DIFFUSE, 0.5, 0.25, 0.15, SPECULAR, 0.6, 0.3, 0.2, SHININESS, 20.0, LMNULL] | 
					
						
							|  |  |  | wallmat = [ DIFFUSE, 0.4, 0.2, 0.1, AMBIENT, 0.4, 0.20, 0.10, SPECULAR, 0.0, 0.0, 0.0, SHININESS, 20.0, LMNULL] | 
					
						
							|  |  |  | offwhite = [ DIFFUSE, 0.8, 0.8, 0.6, AMBIENT, 0.8, 0.8, 0.6, SPECULAR, 0.9, 0.9, 0.9, SHININESS, 30.0, LMNULL] | 
					
						
							|  |  |  | doormat = [ DIFFUSE, 0.1, 0.2, 0.5, AMBIENT, 0.2, 0.4, 1.0, SPECULAR, 0.2, 0.4, 1.0, SHININESS, 60.0, LMNULL] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | toplight = [ LCOLOR, 1.0, 1.0, 0.5, \ | 
					
						
							|  |  |  | 	POSITION, 0.0, 0.0, 11.0, 1.0, LMNULL] | 
					
						
							|  |  |  | floor1light = [ LCOLOR, 1.0, 1.0, 1.0, POSITION, 3.9, -3.9, 0.0, 1.0, \ | 
					
						
							|  |  |  | 	SPOTDIRECTION, 1.0, 1.0, 0.0, SPOTLIGHT, 10.0, 90.0, LMNULL] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | lmodel = [ AMBIENT, 0.92, 0.8, 0.5, LOCALVIEWER, 1.0, LMNULL] | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def lighting(): | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	lmdef(DEFMATERIAL, 1, green_velvet) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	lmdef(DEFMATERIAL, 2, silver) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 3, floormat) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 4, wallmat) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 5, offwhite) | 
					
						
							|  |  |  | 	lmdef(DEFMATERIAL, 6, doormat) | 
					
						
							|  |  |  | 	lmdef(DEFLIGHT, 1, toplight) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	lmdef(DEFLIGHT, 2, floor1light) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	lmdef(DEFLMODEL, 1, lmodel) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	lmbind(MATERIAL, 1) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	lmbind(LIGHT0, 1) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	lmbind(LIGHT1, 2) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	lmbind(LMODEL, 1) | 
					
						
							|  |  |  | 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] | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | def defun(axis): | 
					
						
							|  |  |  | 	done = 0 | 
					
						
							|  |  |  | 	while not done: | 
					
						
							|  |  |  | 	    print 'F'+axis+'(t) = ', | 
					
						
							|  |  |  | 	    s = sys.stdin.readline(100) | 
					
						
							|  |  |  | 	    print | 
					
						
							|  |  |  | 	    try: | 
					
						
							|  |  |  | 		s = 'def f'+axis+'(t): return '+s | 
					
						
							|  |  |  | 		exec(s, main_dict) | 
					
						
							|  |  |  | 		done = 1 | 
					
						
							|  |  |  | 	    except RuntimeError: | 
					
						
							|  |  |  | 		print 'Sorry, there is a syntax error in your expression' | 
					
						
							|  |  |  | def getfunctions(): | 
					
						
							|  |  |  | 	print 'Welcome to the CWI art simulator. You can now enter X, Y and Z' | 
					
						
							|  |  |  | 	print 'coordinates as a function of t.' | 
					
						
							|  |  |  | 	print 'Normal trig functions are available. Please use floating point' | 
					
						
							|  |  |  | 	print 'values only (so 0.0 for 0). Comments to jack@cwi.nl' | 
					
						
							|  |  |  | 	defun('x') | 
					
						
							|  |  |  | 	defun('y') | 
					
						
							|  |  |  | 	defun('z') | 
					
						
							|  |  |  | 	print 'Ok, here you go. Use mouse+right button to move up/down,' | 
					
						
							|  |  |  | 	print 'mouse+middle to speed up/slow down time. type ESC to quit simulation' | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	getfunctions() | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	foreground() | 
					
						
							|  |  |  | 	prefposition(100,600,100,600) | 
					
						
							|  |  |  | 	void = winopen('cyl') | 
					
						
							|  |  |  | 	qdevice(ESCKEY) | 
					
						
							|  |  |  | 	qdevice(MOUSE1) | 
					
						
							|  |  |  | 	qdevice(MOUSE2) | 
					
						
							|  |  |  | 	qdevice(PKEY) | 
					
						
							|  |  |  | 	RGBmode() | 
					
						
							|  |  |  | 	doublebuffer() | 
					
						
							|  |  |  | 	gconfig() | 
					
						
							|  |  |  | 	zbuffer(1) | 
					
						
							|  |  |  | 	mmode(MVIEWING) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	perspective(400, 1.0, 1.0, 20.0) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	loadmatrix(IdMat) | 
					
						
							|  |  |  | 	vx = 0.0 | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	vy = -6.0 | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	vz = 0.0 | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	lighting() | 
					
						
							|  |  |  | 	t = -1.0 | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	step = 1.0 | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	bol = mkcyl(12,24, 1) | 
					
						
							|  |  |  | 	cable = mkcyl(1, 6, 0) | 
					
						
							|  |  |  | 	floors = drawfloors() | 
					
						
							|  |  |  | 	walls = drawwalls() | 
					
						
							|  |  |  | 	pillar = mkcyl(1,4,0) | 
					
						
							|  |  |  | 	railing = drawrailing() | 
					
						
							|  |  |  | 	doors = drawdoors() | 
					
						
							|  |  |  | 	shademodel(GOURAUD) | 
					
						
							|  |  |  | 	mousing = -1 | 
					
						
							|  |  |  | 	pausing = 0 | 
					
						
							|  |  |  | 	while 1: | 
					
						
							|  |  |  | 	    # | 
					
						
							|  |  |  | 	    # Check for some user input | 
					
						
							|  |  |  | 	    # | 
					
						
							|  |  |  | 	    if qtest(): | 
					
						
							|  |  |  | 		dev, value = qread() | 
					
						
							|  |  |  | 		if dev == PKEY and value == 1: | 
					
						
							|  |  |  | 			pausing = 1 | 
					
						
							|  |  |  | 		if dev == ESCKEY: | 
					
						
							|  |  |  | 		    break | 
					
						
							|  |  |  | 		elif (dev==MOUSE1 or dev==MOUSE2) and value == 1: | 
					
						
							|  |  |  | 		    if mousing > 0: | 
					
						
							|  |  |  | 			vx = 0.0 | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 			vy = -6.0 | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 			vz = 0.0 | 
					
						
							|  |  |  | 		    mousing = dev | 
					
						
							|  |  |  | 		    oldx = getvaluator(MOUSEX) | 
					
						
							|  |  |  | 		    oldy = getvaluator(MOUSEY) | 
					
						
							|  |  |  | 		elif (dev==MOUSE1 or dev==MOUSE2): | 
					
						
							|  |  |  | 		    mousing = -1 | 
					
						
							|  |  |  | 	    if mousing >= 0: | 
					
						
							|  |  |  | 		newx = getvaluator(MOUSEX) | 
					
						
							|  |  |  | 		newy = getvaluator(MOUSEY) | 
					
						
							|  |  |  | 		if newy <> oldy and mousing==MOUSE1: | 
					
						
							|  |  |  | 		    vz = vz + float(newy - oldy)/100.0 | 
					
						
							|  |  |  | 		    dist = sqrt(vx*vx + vy*vy + vz*vz) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 		    perspective(400, 1.0, 1.0, dist+16.0) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 		    loadmatrix(IdMat) | 
					
						
							|  |  |  | 		    if vz < 0.0: | 
					
						
							|  |  |  | 			lookat(vx, vy, vz, 0.0, 0.0, 0.0, 1800) | 
					
						
							|  |  |  | 		    else: | 
					
						
							|  |  |  | 			lookat(vx, vy, vz, 0.0, 0.0, 0.0, 0) | 
					
						
							|  |  |  | 		if newy <> oldy and mousing==MOUSE2: | 
					
						
							|  |  |  | 		    step = step * exp(float(newy-oldy)/400.0) | 
					
						
							|  |  |  | 	    if getbutton(CTRLKEY) == 0: | 
					
						
							|  |  |  | 		t = t + step | 
					
						
							|  |  |  | 	    else: | 
					
						
							|  |  |  | 		t = t - step | 
					
						
							|  |  |  | 	    if getbutton(LEFTSHIFTKEY) == 0: | 
					
						
							|  |  |  | 		shademodel(GOURAUD) | 
					
						
							|  |  |  | 	    else: | 
					
						
							|  |  |  | 		shademodel(FLAT) | 
					
						
							|  |  |  | 	    # | 
					
						
							|  |  |  | 	    # Draw background and axis | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	    cpack(0x105090) | 
					
						
							|  |  |  | 	    clear() | 
					
						
							|  |  |  | 	    zclear() | 
					
						
							|  |  |  | 	    cpack(0x905010) | 
					
						
							|  |  |  | 	    axis() | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	    # | 
					
						
							|  |  |  | 	    # Draw object | 
					
						
							|  |  |  | 	    # | 
					
						
							|  |  |  | 	    bolx = fx(t) | 
					
						
							|  |  |  | 	    boly = fy(t) | 
					
						
							|  |  |  | 	    bolz = fz(t) | 
					
						
							|  |  |  | 	    err = '' | 
					
						
							|  |  |  | 	    if bolx < -4.0 or bolx > 4.0: | 
					
						
							|  |  |  | 		err = 'X('+`bolx`+') out of range [-4,4]' | 
					
						
							|  |  |  | 	    if boly < -4.0 or boly > 4.0: | 
					
						
							|  |  |  | 		err = 'Y('+`boly`+') out of range [-4,4]' | 
					
						
							|  |  |  | 	    if bolz < -4.0 or bolz > 8.0: | 
					
						
							|  |  |  | 		err = 'Z('+`bolz`+') out of range [-4,8]' | 
					
						
							|  |  |  | 	    if not err: | 
					
						
							|  |  |  | 		pushmatrix() | 
					
						
							|  |  |  | 		translate(bolx, boly, bolz) | 
					
						
							|  |  |  | 		scale(0.3, 0.3, 0.3) | 
					
						
							|  |  |  | 		lmbind(MATERIAL, 2) | 
					
						
							|  |  |  | 		callobj(bol) | 
					
						
							|  |  |  | 		popmatrix() | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		# Draw the cables | 
					
						
							|  |  |  | 		# | 
					
						
							|  |  |  | 		bolz = bolz + 0.3 | 
					
						
							|  |  |  | 		pushmatrix() | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 		linesmooth(SML_ON) | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 		bgnline() | 
					
						
							|  |  |  | 		v3i(-4,-4,9) | 
					
						
							|  |  |  | 		v3f(bolx, boly, bolz) | 
					
						
							|  |  |  | 		endline() | 
					
						
							|  |  |  | 		bgnline() | 
					
						
							|  |  |  | 		v3i(-4,4,9) | 
					
						
							|  |  |  | 		v3f(bolx, boly, bolz) | 
					
						
							|  |  |  | 		endline() | 
					
						
							|  |  |  | 		bgnline() | 
					
						
							|  |  |  | 		v3i(4,-4,9) | 
					
						
							|  |  |  | 		v3f(bolx, boly, bolz) | 
					
						
							|  |  |  | 		endline() | 
					
						
							|  |  |  | 		bgnline() | 
					
						
							|  |  |  | 		v3i(4,4,9) | 
					
						
							|  |  |  | 		v3f(bolx, boly, bolz) | 
					
						
							|  |  |  | 		endline() | 
					
						
							|  |  |  | 		popmatrix() | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 	    # | 
					
						
							|  |  |  | 	    # draw the floors | 
					
						
							|  |  |  | 	    # | 
					
						
							|  |  |  | 	    lmbind(MATERIAL, 3) | 
					
						
							|  |  |  | 	    callobj(floors) | 
					
						
							|  |  |  | 	    lmbind(MATERIAL, 4) | 
					
						
							|  |  |  | 	    callobj(walls) | 
					
						
							|  |  |  | 	    lmbind(MATERIAL, 5) | 
					
						
							|  |  |  | 	    pushmatrix() | 
					
						
							|  |  |  | 	    translate(-4.5,4.5,3.0) | 
					
						
							|  |  |  | 	    scale(0.2,0.2,9.0) | 
					
						
							|  |  |  | 	    rotate(450,'z') | 
					
						
							|  |  |  | 	    callobj(pillar) | 
					
						
							|  |  |  | 	    popmatrix() | 
					
						
							|  |  |  | 	    callobj(railing) | 
					
						
							|  |  |  | 	    lmbind(MATERIAL, 6) | 
					
						
							|  |  |  | 	    pushmatrix() | 
					
						
							|  |  |  | 	    translate(0.0, -0.01, 0.0) | 
					
						
							|  |  |  | 	    callobj(doors) | 
					
						
							|  |  |  | 	    popmatrix() | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 	    if mousing == MOUSE2 or err: | 
					
						
							|  |  |  | 		cpack(0xff0000) | 
					
						
							|  |  |  | 		cmov(0.0, 0.0, 0.4) | 
					
						
							|  |  |  | 		charstr('t='+`t`) | 
					
						
							|  |  |  | 	    if mousing == MOUSE2: | 
					
						
							|  |  |  | 		cpack(0xff0000) | 
					
						
							|  |  |  | 		cmov(0.0, 0.0, 0.2) | 
					
						
							|  |  |  | 		charstr('delta-t='+`step`) | 
					
						
							|  |  |  | 	    if err: | 
					
						
							|  |  |  | 		cpack(0xff00) | 
					
						
							|  |  |  | 		cmov(0.0, 0.0, 0.2) | 
					
						
							| 
									
										
										
										
											1992-12-14 13:01:06 +00:00
										 |  |  | 		print err | 
					
						
							| 
									
										
										
										
											1992-03-30 13:18:37 +00:00
										 |  |  | 		charstr(err) | 
					
						
							|  |  |  | 		pausing = 1 | 
					
						
							|  |  |  | 	    if pausing: | 
					
						
							|  |  |  | 		cpack(0xff00) | 
					
						
							|  |  |  | 		cmov(0.0, 0.0, 0.0) | 
					
						
							|  |  |  | 		charstr('Pausing, type P to continue') | 
					
						
							|  |  |  | 	    swapbuffers() | 
					
						
							|  |  |  | 	    if pausing: | 
					
						
							|  |  |  | 		while 1: | 
					
						
							|  |  |  | 		    dv=qread() | 
					
						
							|  |  |  | 		    if dv==(PKEY,1): | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		    if dv==(ESCKEY,1): | 
					
						
							|  |  |  | 			sys.exit(0) | 
					
						
							|  |  |  | 		pausing = 0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | try: | 
					
						
							|  |  |  |     main() | 
					
						
							|  |  |  | except KeyboardInterrupt: | 
					
						
							|  |  |  |     sys.exit(1) |