1 /*
2 PLIB - A Suite of Portable Game Libraries
3 Copyright (C) 1998,2002 Steve Baker
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
19 For further information visit http://plib.sourceforge.net
20
21 $Id: ssgaTeapot.cxx 2015 2005-02-02 15:48:09Z sjbaker $
22 */
23
24
25 #include "ssgAux.h"
26 #include <string.h>
27
28 static int patch [][ 17 ] =
29 {
30 /* Rim: */
31 { 2, 102, 103, 104, 105,
32 4, 5, 6, 7,
33 8, 9, 10, 11,
34 12, 13, 14, 15 },
35 /* Body: */
36 { 2, 12, 13, 14, 15,
37 16, 17, 18, 19,
38 20, 21, 22, 23,
39 24, 25, 26, 27 },
40 { 2, 24, 25, 26, 27,
41 29, 30, 31, 32,
42 33, 34, 35, 36,
43 37, 38, 39, 40 },
44 /* Lid: */
45 { 2, 96, 96, 96, 96,
46 97, 98, 99, 100,
47 101, 101, 101, 101,
48 0, 1, 2, 3 },
49 { 2, 0, 1, 2, 3,
50 106, 107, 108, 109,
51 110, 111, 112, 113,
52 114, 115, 116, 117 },
53 /* Handle: */
54 { 1, 41, 42, 43, 44,
55 45, 46, 47, 48,
56 49, 50, 51, 52,
57 53, 54, 55, 56 },
58 { 1, 53, 54, 55, 56,
59 57, 58, 59, 60,
60 61, 62, 63, 64,
61 28, 65, 66, 67 },
62 /* Spout: */
63 { 1, 68, 69, 70, 71,
64 72, 73, 74, 75,
65 76, 77, 78, 79,
66 80, 81, 82, 83 },
67 { 1, 80, 81, 82, 83,
68 84, 85, 86, 87,
69 88, 89, 90, 91,
70 92, 93, 94, 95 },
71 /* Bottom: */
72 { 2, 118, 118, 118, 118,
73 124, 122, 119, 121,
74 123, 126, 125, 120,
75 40, 39, 38, 37 },
76
77 /* End Marker: */
78 { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }
79 } ;
80
81 static sgVec3 vertex [] =
82 {
83 { 0.2000f, 0.0000f, 2.70000f }, /* 00 */
84 { 0.2000f, -0.1120f, 2.70000f },
85 { 0.1120f, -0.2000f, 2.70000f },
86 { 0.0000f, -0.2000f, 2.70000f },
87 { 1.3375f, 0.0000f, 2.53125f },
88 { 1.3375f, -0.7490f, 2.53125f },
89 { 0.7490f, -1.3375f, 2.53125f },
90 { 0.0000f, -1.3375f, 2.53125f },
91 { 1.4375f, 0.0000f, 2.53125f },
92 { 1.4375f, -0.8050f, 2.53125f },
93
94 { 0.8050f, -1.4375f, 2.53125f }, /* 10 */
95 { 0.0000f, -1.4375f, 2.53125f },
96 { 1.5000f, 0.0000f, 2.40000f },
97 { 1.5000f, -0.8400f, 2.40000f },
98 { 0.8400f, -1.5000f, 2.40000f },
99 { 0.0000f, -1.5000f, 2.40000f },
100 { 1.7500f, 0.0000f, 1.87500f },
101 { 1.7500f, -0.9800f, 1.87500f },
102 { 0.9800f, -1.7500f, 1.87500f },
103 { 0.0000f, -1.7500f, 1.87500f },
104
105 { 2.0000f, 0.0000f, 1.35000f }, /* 20 */
106 { 2.0000f, -1.1200f, 1.35000f },
107 { 1.1200f, -2.0000f, 1.35000f },
108 { 0.0000f, -2.0000f, 1.35000f },
109 { 2.0000f, 0.0000f, 0.90000f },
110 { 2.0000f, -1.1200f, 0.90000f },
111 { 1.1200f, -2.0000f, 0.90000f },
112 { 0.0000f, -2.0000f, 0.90000f },
113 { -2.0000f, 0.0000f, 0.90000f },
114 { 2.0000f, 0.0000f, 0.45000f },
115
116 { 2.0000f, -1.1200f, 0.45000f }, /* 30 */
117 { 1.1200f, -2.0000f, 0.45000f },
118 { 0.0000f, -2.0000f, 0.45000f },
119 { 1.5000f, 0.0000f, 0.22500f },
120 { 1.5000f, -0.8400f, 0.22500f },
121 { 0.8400f, -1.5000f, 0.22500f },
122 { 0.0000f, -1.5000f, 0.22500f },
123 { 1.5000f, 0.0000f, 0.15000f },
124 { 1.5000f, -0.8400f, 0.15000f },
125 { 0.8400f, -1.5000f, 0.15000f },
126
127 { 0.0000f, -1.5000f, 0.15000f }, /* 40 */
128 { -1.6000f, 0.0000f, 2.02500f },
129 { -1.6000f, -0.3000f, 2.02500f },
130 { -1.5000f, -0.3000f, 2.25000f },
131 { -1.5000f, 0.0000f, 2.25000f },
132 { -2.3000f, 0.0000f, 2.02500f },
133 { -2.3000f, -0.3000f, 2.02500f },
134 { -2.5000f, -0.3000f, 2.25000f },
135 { -2.5000f, 0.0000f, 2.25000f },
136 { -2.7000f, 0.0000f, 2.02500f },
137
138 { -2.7000f, -0.3000f, 2.02500f }, /* 50 */
139 { -3.0000f, -0.3000f, 2.25000f },
140 { -3.0000f, 0.0000f, 2.25000f },
141 { -2.7000f, 0.0000f, 1.80000f },
142 { -2.7000f, -0.3000f, 1.80000f },
143 { -3.0000f, -0.3000f, 1.80000f },
144 { -3.0000f, 0.0000f, 1.80000f },
145 { -2.7000f, 0.0000f, 1.57500f },
146 { -2.7000f, -0.3000f, 1.57500f },
147 { -3.0000f, -0.3000f, 1.35000f },
148
149 { -3.0000f, 0.0000f, 1.35000f }, /* 60 */
150 { -2.5000f, 0.0000f, 1.12500f },
151 { -2.5000f, -0.3000f, 1.12500f },
152 { -2.6500f, -0.3000f, 0.93750f },
153 { -2.6500f, 0.0000f, 0.93750f },
154 { -2.0000f, -0.3000f, 0.90000f },
155 { -1.9000f, -0.3000f, 0.60000f },
156 { -1.9000f, 0.0000f, 0.60000f },
157 { 1.7000f, 0.0000f, 1.42500f },
158 { 1.7000f, -0.6600f, 1.42500f },
159
160 { 1.7000f, -0.6600f, 0.60000f }, /* 70 */
161 { 1.7000f, 0.0000f, 0.60000f },
162 { 2.6000f, 0.0000f, 1.42500f },
163 { 2.6000f, -0.6600f, 1.42500f },
164 { 3.1000f, -0.6600f, 0.82500f },
165 { 3.1000f, 0.0000f, 0.82500f },
166 { 2.3000f, 0.0000f, 2.10000f },
167 { 2.3000f, -0.2500f, 2.10000f },
168 { 2.4000f, -0.2500f, 2.02500f },
169 { 2.4000f, 0.0000f, 2.02500f },
170
171 { 2.7000f, 0.0000f, 2.40000f }, /* 80 */
172 { 2.7000f, -0.2500f, 2.40000f },
173 { 3.3000f, -0.2500f, 2.40000f },
174 { 3.3000f, 0.0000f, 2.40000f },
175 { 2.8000f, 0.0000f, 2.47500f },
176 { 2.8000f, -0.2500f, 2.47500f },
177 { 3.5250f, -0.2500f, 2.49375f },
178 { 3.5250f, 0.0000f, 2.49375f },
179 { 2.9000f, 0.0000f, 2.47500f },
180 { 2.9000f, -0.1500f, 2.47500f },
181
182 { 3.4500f, -0.1500f, 2.51250f }, /* 90 */
183 { 3.4500f, 0.0000f, 2.51250f },
184 { 2.8000f, 0.0000f, 2.40000f },
185 { 2.8000f, -0.1500f, 2.40000f },
186 { 3.2000f, -0.1500f, 2.40000f },
187 { 3.2000f, 0.0000f, 2.40000f },
188 { 0.0000f, 0.0000f, 3.15000f },
189 { 0.8000f, 0.0000f, 3.15000f },
190 { 0.8000f, -0.4500f, 3.15000f },
191 { 0.4500f, -0.8000f, 3.15000f },
192
193 { 0.0000f, -0.8000f, 3.15000f }, /* 100 */
194 { 0.0000f, 0.0000f, 2.85000f },
195 { 1.4000f, 0.0000f, 2.40000f },
196 { 1.4000f, -0.7840f, 2.40000f },
197 { 0.7840f, -1.4000f, 2.40000f },
198 { 0.0000f, -1.4000f, 2.40000f },
199 { 0.4000f, 0.0000f, 2.55000f },
200 { 0.4000f, -0.2240f, 2.55000f },
201 { 0.2240f, -0.4000f, 2.55000f },
202 { 0.0000f, -0.4000f, 2.55000f },
203
204 { 1.3000f, 0.0000f, 2.55000f }, /* 110 */
205 { 1.3000f, -0.7280f, 2.55000f },
206 { 0.7280f, -1.3000f, 2.55000f },
207 { 0.0000f, -1.3000f, 2.55000f }, /* Next four verts kludged to make lid fit */
208 { 1.4000f, 0.0000f, 2.40000f }, /* { 1.3000, 0.0000, 2.40000 }, */
209 { 1.4000f, -0.7840f, 2.40000f }, /* { 1.3000, -0.7280, 2.40000 }, */
210 { 0.7840f, -1.4000f, 2.40000f }, /* { 0.7280, -1.3000, 2.40000 }, */
211 { 0.0000f, -1.4000f, 2.40000f }, /* { 0.0000, -1.3000, 2.40000 }, */
212 { 0.0000f, 0.0000f, 0.00000f },
213 { 1.4250f, -0.7980f, 0.00000f },
214
215 { 1.5000f, 0.0000f, 0.07500f }, /* 120 */
216 { 1.4250f, 0.0000f, 0.00000f },
217 { 0.7980f, -1.4250f, 0.00000f },
218 { 0.0000f, -1.5000f, 0.07500f },
219 { 0.0000f, -1.4250f, 0.00000f },
220 { 1.5000f, -0.8400f, 0.07500f },
221 { 0.8400f, -1.5000f, 0.07500f }
222 } ;
223
224
regenerate()225 void ssgaTeapot::regenerate ()
226 {
227 if ( kidState != NULL ) kidState -> ref () ;
228 removeAllKids () ;
229 if ( kidState != NULL ) kidState -> deRef () ;
230
231 for ( int i = 0 ; patch[i][0] >= 0 ; i++ )
232 {
233 ssgaPatch *p = new ssgaPatch ( ntriangles / 32 ) ;
234 int j ;
235
236 for ( j = 0 ; j < 16 ; j++ )
237 {
238 sgVec3 xyz ;
239 sgVec2 uv ;
240
241 uv [ 0 ] = (float)(j&3)/3.0f ;
242 uv [ 1 ] = (float)(j>>2)/3.0f ;
243
244 sgScaleVec3 ( xyz, vertex[patch[i][j+1]], 1.0f/2.5f ) ;
245 xyz [ 0 ] *= -1.0f ;
246
247 p -> setControlPoint ( j>>2, j&3, xyz, uv, colour ) ;
248 }
249
250 p -> setKidState ( getKidState () ) ;
251 p -> setKidCallback ( SSG_CALLBACK_PREDRAW , getKidPreDrawCB () ) ;
252 p -> setKidCallback ( SSG_CALLBACK_POSTDRAW, getKidPostDrawCB () ) ;
253 p -> setColour ( colour ) ;
254 p -> setCenter ( getCenter () ) ;
255 p -> setSize ( getSize () ) ;
256 p -> regenerate () ;
257
258 /* Make a mirror image in the Y axis */
259
260 sgVec3 xyz ;
261 sgVec2 uv ;
262 sgVec4 rgba ;
263
264 ssgaPatch *p2 = new ssgaPatch ( ntriangles / 32 ) ;
265
266 for ( j = 0 ; j < 16 ; j++ )
267 {
268 p -> getControlPoint ( j>>2, 3-(j&3), xyz, uv, rgba ) ;
269 xyz [ 1 ] *= -1.0f ;
270 p2 -> setControlPoint ( j>>2, j&3, xyz, uv, rgba ) ;
271 }
272
273 p2 -> setKidState ( getKidState () ) ;
274 p2 -> setKidCallback ( SSG_CALLBACK_PREDRAW , getKidPreDrawCB () ) ;
275 p2 -> setKidCallback ( SSG_CALLBACK_POSTDRAW, getKidPostDrawCB () ) ;
276 p2 -> setColour ( colour ) ;
277 p2 -> setCenter ( getCenter () ) ;
278 p2 -> setSize ( getSize () ) ;
279 p2 -> regenerate () ;
280
281 if ( patch[i][0] == 2 )
282 {
283 /* Make a mirror images in the X axis */
284
285 ssgaPatch *p3 = new ssgaPatch ( ntriangles / 32 ) ;
286 ssgaPatch *p4 = new ssgaPatch ( ntriangles / 32 ) ;
287
288 for ( j = 0 ; j < 16 ; j++ )
289 {
290 p -> getControlPoint ( j>>2, 3-(j&3), xyz, uv, rgba ) ;
291 xyz [ 0 ] *= -1.0f ;
292 p3 -> setControlPoint ( j>>2, j&3, xyz, uv, rgba ) ;
293
294 p2 -> getControlPoint ( j>>2, 3-(j&3), xyz, uv, rgba ) ;
295 xyz [ 0 ] *= -1.0f ;
296 p4 -> setControlPoint ( j>>2, j&3, xyz, uv, rgba ) ;
297 }
298
299 p3 -> setKidState ( getKidState () ) ;
300 p3 -> setKidCallback ( SSG_CALLBACK_PREDRAW , getKidPreDrawCB () ) ;
301 p3 -> setKidCallback ( SSG_CALLBACK_POSTDRAW, getKidPostDrawCB () ) ;
302 p3 -> setColour ( colour ) ;
303 p3 -> setCenter ( getCenter () ) ;
304 p3 -> setSize ( getSize () ) ;
305 p3 -> regenerate () ;
306
307 p4 -> setKidState ( getKidState () ) ;
308 p4 -> setKidCallback ( SSG_CALLBACK_PREDRAW , getKidPreDrawCB () ) ;
309 p4 -> setKidCallback ( SSG_CALLBACK_POSTDRAW, getKidPostDrawCB () ) ;
310 p4 -> setColour ( colour ) ;
311 p4 -> setCenter ( getCenter () ) ;
312 p4 -> setSize ( getSize () ) ;
313 p4 -> regenerate () ;
314
315 for ( j = 0 ; j < p3 -> getNumKids () ; j++ )
316 {
317 addKid ( p3->getKid(j) ) ;
318 addKid ( p4->getKid(j) ) ;
319 }
320
321 p3 -> removeAllKids () ;
322 p4 -> removeAllKids () ;
323 delete p3 ;
324 delete p4 ;
325 }
326
327 for ( j = 0 ; j < p -> getNumKids () ; j++ )
328 {
329 addKid ( p->getKid(j) ) ;
330 addKid ( p2->getKid(j) ) ;
331 }
332
333 p -> removeAllKids () ;
334 p2 -> removeAllKids () ;
335 delete p ;
336 delete p2 ;
337 }
338
339 recalcBSphere () ;
340 }
341
342
343