1 
2 #include "tux.h"
3 
4 ssgSimpleState *fire_gst   , *herring_gst , *cloak_gst     , *fin_gst    ,
5                *wood2_gst, *sand_gst, *poster_gst,
6                *wood_gst   , *tuxbeak_gst , *water_gst     , *ice_gst    ,
7                *orca_gst   , *orcafin_gst , *party_gst     , *supertx_gst,
8                *tree_gst   , *tuxfoot_gst , *grass_gst     , *sparkle_gst,
9                *tux_gst    , *fuzzy_gst   , *stripes_gst   , *camera_gst,
10                *pebbles_gst, *gun_gst     , *fademsk_gst   , *swirl_gst  ,
11                *brick_gst  , *brick2_gst  , *xmastree_gst  , *think_gst  ,
12                *bubble_gst , *tinytux_gst , *default_gst   , *herringbones_gst,
13                *lava_gst   , *spark_gst   , *snowball_gst  , *sproingpad_gst,
14                *splash_gst , *smoke_gst   , *clearice_gst  , *waterfall_gst,
15                *rock_gst   , *nocamera_gst, *lightning_gst , *blueneon_gst,
16                *glass_gst  , *moonrock_gst, *startline_gst , *finishline_gst,
17                *snow_gst   , *smoke2_gst  , *thermometer_gst, *oxygen_gst,
18                *gown_gst   , *gownbeak_gst, *bow_gst       , *solidblack_gst,
19                *cloud_gst  , *kill_water_gst ;
20 
21 Material gs_setup [] =
22 {
23   /*    gst          texture_map            clamp, trans,aref,light,frctn,flags */
24   { &default_gst, "",                       FALSE, FALSE,0.0, TRUE, 1.0, TUXMAT_BORING },
25 
26   { &oxygen_gst,  "images/oxygen.rgb",      FALSE, TRUE ,0.2, FALSE, 1.0, TUXMAT_OXYGEN | TUXMAT_IGNORE },
27   { &cloud_gst,  "images/clouds.rgb",       FALSE, FALSE,0.2, FALSE, 1.0, TUXMAT_BORING },
28 
29 /* Penguin Materials. */
30   { &    tux_gst, "penguin/Penguin_body.rgb", FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
31   { &tuxbeak_gst, "penguin/Penguin_beak.rgb", FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
32   { &   gown_gst, "penguin/Gown_body.rgb",    FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
33   { &gownbeak_gst,"penguin/Gown_beak.rgb",    FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
34   { &    bow_gst, "penguin/bow.rgb",          FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
35   { &supertx_gst, "penguin/SuperTux.rgb",     FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
36   { &  cloak_gst, "penguin/red_ripple.rgb",   FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
37   { &  party_gst, "penguin/partygear.rgba",   FALSE, TRUE ,0.0, FALSE, 1.0, TUXMAT_IGNORE },
38   { &tuxfoot_gst, "penguin/Penguin_foot.rgba",TRUE , TRUE ,0.6, FALSE, 1.0, TUXMAT_IGNORE },
39 
40   { &    gun_gst, "images/gun.rgba",          FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_BORING },
41   { &    ice_gst, "images/ice.rgb",           FALSE, FALSE,0.0, TRUE , 0.4, TUXMAT_COLD },
42   { &clearice_gst,"images/ice.rgb",           FALSE, TRUE ,0.2, TRUE , 0.4, TUXMAT_COLD },
43   { &lightning_gst,"images/lightning.rgba",   FALSE, TRUE ,0.2, FALSE, 1.0, TUXMAT_LETHAL },
44   { &blueneon_gst,"images/blue_neon.rgba",    FALSE, TRUE ,0.2, FALSE, 1.0, TUXMAT_LETHAL },
45   { &tinytux_gst, "images/tinytux.rgba",      TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
46   { & camera_gst, "images/camera.rgba",       TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
47   { &thermometer_gst, "images/thermometer.rgb",TRUE, FALSE,0.0, FALSE, 1.0, TUXMAT_IGNORE },
48   { &nocamera_gst,"images/nocamera.rgba",     TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
49   { &   fire_gst, "images/flames.rgba",       FALSE, TRUE ,0.2, FALSE, 1.0, TUXMAT_VERY_HOT },
50   { &   orca_gst, "images/orca_body.rgb",     TRUE , FALSE,0.0, FALSE, 0.3, TUXMAT_BORING },
51   { &   tree_gst, "images/tree.rgba",         FALSE/*TRUE*/ , TRUE ,0.9, FALSE, 1.0, TUXMAT_BORING },
52   { &xmastree_gst,"images/xmastree.rgba",     TRUE , TRUE ,0.9, FALSE, 1.0, TUXMAT_BORING },
53 
54   /*    gst          texture_map            clamp, trans,aref,light,frctn,flags */
55   { &   wood_gst, "images/wood_tile.rgb",     FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
56   { &  brick_gst, "images/brick.rgb",         FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
57   { & brick2_gst, "images/brick2.rgb",        FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
58   { &  fuzzy_gst, "images/fuzzy.inta",        TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
59   { &  grass_gst, "images/ground2.rgb",       FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_BORING },
60   { &   rock_gst, "images/rock.rgb",          FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_BORING },
61   { &  water_gst, "images/water2.rgba",       FALSE, TRUE ,0.2, FALSE, 0.3, TUXMAT_BORING },
62   { &kill_water_gst, "images/water.rgb",      FALSE, FALSE,0.2, FALSE, 0.3, TUXMAT_LETHAL },
63   { &waterfall_gst,"images/waterfall.rgba",   FALSE, TRUE ,0.2, FALSE, 0.3, TUXMAT_IGNORE },
64   { &   lava_gst, "images/lava.rgb",          FALSE, FALSE,0.0, FALSE, 0.3, TUXMAT_VERY_HOT },
65   { &  swirl_gst, "images/swirl.rgb",         FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_EXIT_LEVEL },
66   { & bubble_gst, "images/bubble.rgba",       TRUE,  TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
67   { &  glass_gst, "images/glass.rgba",        FALSE, TRUE ,0.0, FALSE, 0.02,TUXMAT_BORING },
68   { &  smoke_gst, "images/smoke.rgba",        TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
69   { & splash_gst, "images/splash.rgba",       TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
70   { &  think_gst, "images/think.rgba",        TRUE , TRUE ,0.0, FALSE, 1.0, TUXMAT_IGNORE },
71   { &snowball_gst,"images/snowball.rgba",     TRUE , TRUE ,0.7, FALSE, 1.0, TUXMAT_IGNORE },
72   { &   snow_gst, "images/snow.rgb",          FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_COLD   },
73   { &herring_gst, "images/herring.inta",      TRUE , TRUE ,0.9, FALSE, 1.0, TUXMAT_IGNORE },
74   { &herringbones_gst,
75                 "images/herringbones.inta",   TRUE , TRUE ,0.2, FALSE, 1.0, TUXMAT_IGNORE },
76 
77   /*    gst          texture_map            clamp, trans,aref,light,frctn,flags */
78   { &orcafin_gst, "",                         FALSE, FALSE,0.0, FALSE, 1.0, TUXMAT_BORING },
79   { &sparkle_gst, "images/sparkle.rgba",      FALSE, TRUE, 0.0, FALSE, 1.0, TUXMAT_TELEPORTER },
80   { &  spark_gst, "images/spark.rgba",        FALSE, TRUE, 0.0, FALSE, 1.0, TUXMAT_IGNORE },
81   { &stripes_gst, "images/blue_stripe.rgb",   FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_BORING },
82   { &fademsk_gst, "images/tux_text.inta",     TRUE , TRUE ,0.1, FALSE, 1.0, TUXMAT_IGNORE },
83   { &pebbles_gst, "images/pebbles.rgb",       FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_BORING },
84   { &sproingpad_gst,"images/sproing.rgb",     FALSE, FALSE,0.0, TRUE , 2.0, TUXMAT_SPROINGPAD },
85   { &moonrock_gst,"images/moonscape.rgb",     FALSE, FALSE,0.0, TRUE , 1.0, TUXMAT_SPROINGPAD },
86   { &startline_gst ,"images/startline.rgb",   FALSE, FALSE,0.0, TRUE , 2.0, TUXMAT_STARTCLOCK },
87   { &finishline_gst,"images/finishline.rgb",  FALSE, FALSE,0.0, TRUE , 2.0, TUXMAT_STOPCLOCK },
88 
89   { &solidblack_gst, ""                    ,  FALSE, FALSE,0.0, FALSE , 1.0, TUXMAT_BORING },
90   { &  wood2_gst, "images/wood.rgb",     FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
91   { & poster_gst, "images/poster.rgb",     FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
92   { & sand_gst, "images/sand.rgb",     FALSE, FALSE,0.0, TRUE , 1.2, TUXMAT_BORING },
93   { NULL, "", FALSE, FALSE, 0.0, FALSE, 1.0, TUXMAT_BORING }
94 } ;
95 
96 
install(int index)97 void Material::install ( int index )
98 {
99   *gst = new ssgSimpleState ;
100 
101   (*gst) -> ref () ;
102   (*gst) -> setExternalPropertyIndex ( index ) ;
103 
104   if ( texture_map [ 0 ] != '\0' )
105   {
106     (*gst) -> setTexture ( texture_map, !clamp_tex, !clamp_tex ) ;
107     (*gst) -> enable ( GL_TEXTURE_2D ) ;
108   }
109   else
110     (*gst) -> disable ( GL_TEXTURE_2D ) ;
111 
112   if ( lighting )
113     (*gst) -> enable ( GL_LIGHTING ) ;
114   else
115     (*gst) -> disable ( GL_LIGHTING ) ;
116 
117   (*gst) -> setShadeModel ( GL_SMOOTH ) ;
118   (*gst) -> enable ( GL_COLOR_MATERIAL ) ;
119   (*gst) -> enable ( GL_CULL_FACE      ) ;
120   (*gst) -> setColourMaterial ( GL_AMBIENT_AND_DIFFUSE ) ;
121   (*gst) -> setMaterial ( GL_EMISSION, 0, 0, 0, 1 ) ;
122   (*gst) -> setMaterial ( GL_SPECULAR, 1, 1, 1, 1 ) ;
123   (*gst) -> setShininess ( 0 ) ;
124 
125   if ( transparency )
126   {
127     (*gst) -> setTranslucent () ;
128     (*gst) -> enable ( GL_ALPHA_TEST ) ;
129     (*gst) -> setAlphaClamp ( alpha_ref ) ;
130     (*gst) -> enable ( GL_BLEND ) ;
131   }
132   else
133   {
134     (*gst) -> setOpaque () ;
135     (*gst) -> disable ( GL_BLEND ) ;
136   }
137 }
138 
139 
140 
getAppState(char * fname)141 ssgState *getAppState ( char *fname )
142 {
143   if ( fname == NULL || fname[0] == '\0' )
144     return gs_setup [ 0 ] . getState() ;
145 
146   char *fn ;
147 
148   /* Remove all leading path information. */
149 
150   for ( fn = & fname [ strlen ( fname ) - 1 ] ; fn != fname &&
151                                                *fn != '/' ; fn-- )
152     /* Search back for a '/' */ ;
153 
154   if ( *fn == '/' )
155     fn++ ;
156 
157   char basename [ 1024 ] ;
158 
159   strcpy ( basename, fn ) ;
160 
161   /* Remove last trailing extension. */
162 
163   for ( fn = & basename [ strlen ( basename ) - 1 ] ; fn != basename &&
164                                                      *fn != '.' ; fn-- )
165     /* Search back for a '.' */ ;
166 
167   if ( *fn == '.' )
168     *fn = '\0' ;
169 
170   for ( int i = 0 ; ! gs_setup [ i ] . isNull () ; i++ )
171   {
172     char *fname2 = gs_setup [ i ] . getTexFname () ;
173 
174     if ( fname2 != NULL && fname2[0] != '\0' )
175     {
176       char *fn2 ;
177 
178       /* Remove all leading path information. */
179 
180       for ( fn2 = & fname2 [ strlen ( fname2 ) -1 ] ; fn2 != fname2 &&
181                                                      *fn2 != '/' ; fn2-- )
182         /* Search back for a '/' */ ;
183 
184       if ( *fn2 == '/' )
185         fn2++ ;
186 
187       char basename2 [ 1024 ] ;
188 
189       strcpy ( basename2, fn2 ) ;
190 
191       /* Remove last trailing extension. */
192 
193       for ( fn2 = & basename2 [ strlen ( basename2 ) - 1 ] ; fn2 != basename2 &&
194                                                          *fn2 != '.' ; fn2-- )
195         /* Search back for a '.' */ ;
196 
197       if ( *fn2 == '.' )
198         *fn2 = '\0' ;
199 
200       if ( strcmp ( basename, basename2 ) == 0 )
201         return gs_setup [ i ] . getState() ;
202     }
203   }
204 
205   return NULL ;
206 }
207 
208 
209 
initMaterials()210 void initMaterials ()
211 {
212   for ( int i = 0 ; ! gs_setup [ i ] . isNull () ; i++ )
213     gs_setup [ i ] . install ( i ) ;
214 
215   ssgSetAppStateCallback ( getAppState ) ;
216 }
217 
218 
getMaterial(ssgState * s)219 Material *getMaterial ( ssgState *s )
220 {
221   return & ( gs_setup [ s -> getExternalPropertyIndex () ] ) ;
222 }
223 
224 
getMaterial(ssgLeaf * l)225 Material *getMaterial ( ssgLeaf *l )
226 {
227   return getMaterial ( l -> getState () ) ;
228 }
229 
230