blob: 6efef48bd117defec993d3a877b11d68a5ff66a9 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env 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 = []
Guido van Rossumb4624b92000-02-25 11:46:50 +000026 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))
Guido van Rossum453bd401992-03-30 13:18:37 +000030 c.append(ci)
31 #
32 ci = []
Guido van Rossumb4624b92000-02-25 11:46:50 +000033 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))
Guido van Rossum453bd401992-03-30 13:18:37 +000037 c.append(ci)
38 #
39 ci = []
Guido van Rossumb4624b92000-02-25 11:46:50 +000040 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))
Guido van Rossum453bd401992-03-30 13:18:37 +000044 c.append(ci)
45 #
46 ci = []
Guido van Rossumb4624b92000-02-25 11:46:50 +000047 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))
Guido van Rossum453bd401992-03-30 13:18:37 +000051 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 = []
Guido van Rossumb4624b92000-02-25 11:46:50 +000061 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))
Guido van Rossum453bd401992-03-30 13:18:37 +000070 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()