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