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