blob: af2039bc22ff1b412d4dadce266b1bbc0f5f69a7 [file] [log] [blame]
Guido van Rossum23bafde1992-12-14 13:03:10 +00001#! /usr/local/bin/python
Guido van Rossum453bd401992-03-30 13:18:37 +00002
3# Rotate a 3D surface created using NURBS.
4#
5# Press left mouse button to toggle surface trimming.
6# Press ESC to quit.
7#
8# See the GL manual for an explanation of NURBS.
9
10from gl import *
11from GL import *
12from DEVICE import *
13
14TRUE = 1
15FALSE = 0
16ORDER = 4
17
18idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
19
20surfknots = [-1, -1, -1, -1, 1, 1, 1, 1]
21
22def make_ctlpoints():
23 c = []
24 #
25 ci = []
26 ci.append(-2.5, -3.7, 1.0)
27 ci.append(-1.5, -3.7, 3.0)
28 ci.append(1.5, -3.7, -2.5)
29 ci.append(2.5, -3.7, -0.75)
30 c.append(ci)
31 #
32 ci = []
33 ci.append(-2.5, -2.0, 3.0)
34 ci.append(-1.5, -2.0, 4.0)
35 ci.append(1.5, -2.0, -3.0)
36 ci.append(2.5, -2.0, 0.0)
37 c.append(ci)
38 #
39 ci = []
40 ci.append(-2.5, 2.0, 1.0)
41 ci.append(-1.5, 2.0, 0.0)
42 ci.append(1.5, 2.0, -1.0)
43 ci.append(2.5, 2.0, 2.0)
44 c.append(ci)
45 #
46 ci = []
47 ci.append(-2.5, 2.7, 1.25)
48 ci.append(-1.5, 2.7, 0.1)
49 ci.append(1.5, 2.7, -0.6)
50 ci.append(2.5, 2.7, 0.2)
51 c.append(ci)
52 #
53 return c
54
55ctlpoints = make_ctlpoints()
56
57trimknots = [0., 0., 0., 1., 1., 2., 2., 3., 3., 4., 4., 4.]
58
59def make_trimpoints():
60 c = []
61 c.append(1.0, 0.0, 1.0)
62 c.append(1.0, 1.0, 1.0)
63 c.append(0.0, 2.0, 2.0)
64 c.append(-1.0, 1.0, 1.0)
65 c.append(-1.0, 0.0, 1.0)
66 c.append(-1.0, -1.0, 1.0)
67 c.append(0.0, -2.0, 2.0)
68 c.append(1.0, -1.0, 1.0)
69 c.append(1.0, 0.0, 1.0)
70 return c
71
72trimpoints = make_trimpoints()
73
74def main():
75 init_windows()
76 setup_queue()
77 make_lights()
78 init_view()
79 #
80 set_scene()
81 setnurbsproperty( N_ERRORCHECKING, 1.0 )
82 setnurbsproperty( N_PIXEL_TOLERANCE, 50.0 )
83 trim_flag = 0
84 draw_trim_surface(trim_flag)
85 #
86 while 1:
87 while qtest():
88 dev, val = qread()
89 if dev == ESCKEY:
90 return
91 elif dev == WINQUIT:
92 dglclose(-1) # this for DGL only
93 return
94 elif dev == REDRAW:
95 reshapeviewport()
96 set_scene()
97 draw_trim_surface(trim_flag)
98 elif dev == LEFTMOUSE:
99 if val:
100 trim_flag = (not trim_flag)
101 set_scene()
102 draw_trim_surface(trim_flag)
103
104def init_windows():
105 foreground()
106 #prefposition(0, 500, 0, 500)
107 wid = winopen('nurbs')
108 wintitle('NURBS Surface')
109 doublebuffer()
110 RGBmode()
111 gconfig()
112 lsetdepth(0x000, 0x7fffff)
113 zbuffer( TRUE )
114
115def setup_queue():
116 qdevice(ESCKEY)
117 qdevice(REDRAW)
118 qdevice(RIGHTMOUSE)
119 qdevice(WINQUIT)
120 qdevice(LEFTMOUSE) #trimming
121
122def init_view():
123 mmode(MPROJECTION)
124 ortho( -4., 4., -4., 4., -4., 4. )
125 #
126 mmode(MVIEWING)
127 loadmatrix(idmat)
128 #
129 lmbind(MATERIAL, 1)
130
131def set_scene():
132 lmbind(MATERIAL, 0)
133 RGBcolor(150,150,150)
134 lmbind(MATERIAL, 1)
135 clear()
136 zclear()
137 #
138 rotate( 100, 'y' )
139 rotate( 100, 'z' )
140
141def draw_trim_surface(trim_flag):
142 bgnsurface()
143 nurbssurface(surfknots, surfknots, ctlpoints, ORDER, ORDER, N_XYZ)
144 if trim_flag:
145 bgntrim()
146 nurbscurve(trimknots, trimpoints, ORDER-1, N_STW)
147 endtrim()
148 endsurface()
149 swapbuffers()
150
151def make_lights():
152 lmdef(DEFLMODEL,1,[])
153 lmdef(DEFLIGHT,1,[])
154 #
155 # define material #1
156 #
157 a = []
158 a = a + [EMISSION, 0.0, 0.0, 0.0]
159 a = a + [AMBIENT, 0.1, 0.1, 0.1]
160 a = a + [DIFFUSE, 0.6, 0.3, 0.3]
161 a = a + [SPECULAR, 0.0, 0.6, 0.0]
162 a = a + [SHININESS, 2.0]
163 a = a + [LMNULL]
164 lmdef(DEFMATERIAL, 1, a)
165 #
166 # turn on lighting
167 #
168 lmbind(LIGHT0, 1)
169 lmbind(LMODEL, 1)
170
171main()