py-cvs-rel2_1 (Rev 1.2) merge
[python/dscho.git] / Demo / sgi / gl / nurbs.py
blob6efef48bd117defec993d3a877b11d68a5ff66a9
1 #! /usr/bin/env python
3 # Rotate a 3D surface created using NURBS.
5 # Press left mouse button to toggle surface trimming.
6 # Press ESC to quit.
8 # See the GL manual for an explanation of NURBS.
10 from gl import *
11 from GL import *
12 from DEVICE import *
14 TRUE = 1
15 FALSE = 0
16 ORDER = 4
18 idmat = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
20 surfknots = [-1, -1, -1, -1, 1, 1, 1, 1]
22 def make_ctlpoints():
23 c = []
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)
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)
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)
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)
53 return c
55 ctlpoints = make_ctlpoints()
57 trimknots = [0., 0., 0., 1., 1., 2., 2., 3., 3., 4., 4., 4.]
59 def 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
72 trimpoints = make_trimpoints()
74 def main():
75 init_windows()
76 setup_queue()
77 make_lights()
78 init_view()
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)
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)
104 def 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 )
115 def setup_queue():
116 qdevice(ESCKEY)
117 qdevice(REDRAW)
118 qdevice(RIGHTMOUSE)
119 qdevice(WINQUIT)
120 qdevice(LEFTMOUSE) #trimming
122 def init_view():
123 mmode(MPROJECTION)
124 ortho( -4., 4., -4., 4., -4., 4. )
126 mmode(MVIEWING)
127 loadmatrix(idmat)
129 lmbind(MATERIAL, 1)
131 def set_scene():
132 lmbind(MATERIAL, 0)
133 RGBcolor(150,150,150)
134 lmbind(MATERIAL, 1)
135 clear()
136 zclear()
138 rotate( 100, 'y' )
139 rotate( 100, 'z' )
141 def 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()
151 def make_lights():
152 lmdef(DEFLMODEL,1,[])
153 lmdef(DEFLIGHT,1,[])
155 # define material #1
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)
166 # turn on lighting
168 lmbind(LIGHT0, 1)
169 lmbind(LMODEL, 1)
171 main()