diff options
Diffstat (limited to 'Demo/sgi/gl/kunst.py')
-rwxr-xr-x | Demo/sgi/gl/kunst.py | 730 |
1 files changed, 365 insertions, 365 deletions
diff --git a/Demo/sgi/gl/kunst.py b/Demo/sgi/gl/kunst.py index 6d9e04d..f37f979 100755 --- a/Demo/sgi/gl/kunst.py +++ b/Demo/sgi/gl/kunst.py @@ -17,37 +17,37 @@ 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) + 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 + 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 # @@ -55,370 +55,370 @@ 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 + 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() + 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 + 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 + 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 + 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 + 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() + 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() # green_velvet = [ DIFFUSE, 0.05, 0.4, 0.05, LMNULL] silver = [ DIFFUSE, 0.3, 0.3, 0.3, SPECULAR, 0.9, 0.9, 0.95, \ - SHININESS, 40.0, LMNULL] + 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] + 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] + 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(): - lmdef(DEFMATERIAL, 1, green_velvet) - lmdef(DEFMATERIAL, 2, silver) - lmdef(DEFMATERIAL, 3, floormat) - lmdef(DEFMATERIAL, 4, wallmat) - lmdef(DEFMATERIAL, 5, offwhite) - lmdef(DEFMATERIAL, 6, doormat) - lmdef(DEFLIGHT, 1, toplight) - lmdef(DEFLIGHT, 2, floor1light) - lmdef(DEFLMODEL, 1, lmodel) - lmbind(MATERIAL, 1) - lmbind(LIGHT0, 1) - lmbind(LIGHT1, 2) - lmbind(LMODEL, 1) + lmdef(DEFMATERIAL, 1, green_velvet) + lmdef(DEFMATERIAL, 2, silver) + lmdef(DEFMATERIAL, 3, floormat) + lmdef(DEFMATERIAL, 4, wallmat) + lmdef(DEFMATERIAL, 5, offwhite) + lmdef(DEFMATERIAL, 6, doormat) + lmdef(DEFLIGHT, 1, toplight) + lmdef(DEFLIGHT, 2, floor1light) + lmdef(DEFLMODEL, 1, lmodel) + lmbind(MATERIAL, 1) + lmbind(LIGHT0, 1) + lmbind(LIGHT1, 2) + 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' + 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' + 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(): - getfunctions() - foreground() - prefposition(100,600,100,600) - void = winopen('cyl') - qdevice(ESCKEY) - qdevice(MOUSE1) - qdevice(MOUSE2) - qdevice(PKEY) - RGBmode() - doublebuffer() - gconfig() - zbuffer(1) - mmode(MVIEWING) - perspective(400, 1.0, 1.0, 20.0) - loadmatrix(IdMat) - vx = 0.0 - vy = -6.0 - vz = 0.0 - lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0) - lighting() - t = -1.0 - step = 1.0 - 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 - vy = -6.0 - 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) - perspective(400, 1.0, 1.0, dist+16.0) - 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 - cpack(0x105090) - clear() - zclear() - cpack(0x905010) - axis() - # - # 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() - linesmooth(SML_ON) - 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() - # - # 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() - 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) - print err - 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 + getfunctions() + foreground() + prefposition(100,600,100,600) + void = winopen('cyl') + qdevice(ESCKEY) + qdevice(MOUSE1) + qdevice(MOUSE2) + qdevice(PKEY) + RGBmode() + doublebuffer() + gconfig() + zbuffer(1) + mmode(MVIEWING) + perspective(400, 1.0, 1.0, 20.0) + loadmatrix(IdMat) + vx = 0.0 + vy = -6.0 + vz = 0.0 + lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0) + lighting() + t = -1.0 + step = 1.0 + 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 + vy = -6.0 + 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) + perspective(400, 1.0, 1.0, dist+16.0) + 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 + cpack(0x105090) + clear() + zclear() + cpack(0x905010) + axis() + # + # 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() + linesmooth(SML_ON) + 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() + # + # 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() + 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) + print err + 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() |