1 
2 #include  "tux.h"
3 
4 static unsigned int lastGLUTKeystroke = 0 ;
5 
getGLUTSpecialKeystroke(int key,int,int)6 static void getGLUTSpecialKeystroke ( int key, int, int )
7 {
8   lastGLUTKeystroke = 256 + key ;
9 }
10 
getGLUTKeystroke(unsigned char key,int,int)11 static void getGLUTKeystroke ( unsigned char key, int, int )
12 {
13   lastGLUTKeystroke = key ;
14 }
15 
getGLUTKeystroke()16 int getGLUTKeystroke ()
17 {
18   int k = lastGLUTKeystroke ;
19   lastGLUTKeystroke = 0 ;
20   return k ;
21 }
22 
reshape(int w,int h)23 void reshape ( int w, int h )
24 {
25   glViewport ( 0, 0, w, h ) ;
26 }
27 
initWindow(int w,int h)28 void initWindow ( int w, int h )
29 {
30   int fake_argc = 1 ;
31   char *fake_argv[3] ;
32 
33   if ( play_as_gown )
34   {
35     fake_argv[0] = "Gown" ;
36     fake_argv[1] = "Gown T. Penguin stars in 'A Quest for Herring'." ;
37     fake_argv[2] = NULL ;
38   }
39   else
40   {
41     fake_argv[0] = "Tux" ;
42     fake_argv[1] = "Tuxedo T. Penguin stars in 'A Quest for Herring'." ;
43     fake_argv[2] = NULL ;
44   }
45 
46   glutInitWindowPosition ( 0, 0 ) ;
47   glutInitWindowSize     ( w, h ) ;
48   glutInit               ( &fake_argc, fake_argv ) ;
49   glutInitDisplayMode    ( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ) ;
50   glutCreateWindow       ( fake_argv[1] ) ;
51   glutDisplayFunc        ( tuxMainLoop ) ;
52   glutKeyboardFunc       ( getGLUTKeystroke ) ;
53   glutSpecialFunc        ( getGLUTSpecialKeystroke ) ;
54   glutReshapeFunc        ( reshape ) ;
55 #ifndef WIN32
56   glutIdleFunc           ( glutPostRedisplay ) ;
57 #endif
58 }
59 
60 
GFX()61 GFX::GFX ()
62 {
63   int w = 0 ;
64   int h = 0 ;
65 
66   if ( getenv ( "TUX_AQFH_WIDTH" ) != NULL )
67     w = atoi ( getenv ( "TUX_AQFH_WIDTH" ) ) ;
68 
69   if ( getenv ( "TUX_AQFH_HEIGHT" ) != NULL )
70     h = atoi ( getenv ( "TUX_AQFH_HEIGHT" ) ) ;
71 
72   if ( w < 1 ) w = 640 ;
73   if ( h < 1 ) h = 480 ;
74 
75   initWindow ( w, h ) ;
76 
77   ssgInit  () ;
78 
79   sgVec4 clear ;
80   sgSetVec4 ( clear, 0.2, 0.7, 1.0, 1.0 ) ;
81 
82   static int firsttime = 1 ;
83 
84   if ( firsttime )
85   {
86     firsttime = 0 ;
87     initMaterials () ;
88   }
89 
90   ssgSetFOV ( 45.0f, 0.0f ) ;
91   ssgSetNearFar ( 1.0f, 700.0f ) ;
92 
93   sgCoord cam ;
94   sgSetVec3 ( cam.xyz, 0, 0, 20 ) ;
95   sgSetVec3 ( cam.hpr, 0, 0,  0 ) ;
96 
97   ssgSetCamera ( & cam ) ;
98 }
99 
100 
update()101 void GFX::update ()
102 {
103   sgVec4 skyfogcol ;
104   sgVec3 sunposn ;
105 
106   sgSetVec3 ( sunposn, 0.2, 0.5, 0.5 ) ;
107 
108   if ( ocean )
109     ocean -> update () ;
110 
111   if ( ocean && camera -> isSubmerged () )
112   {
113     switch ( ocean -> getType () )
114     {
115       case OCEAN_BLACKHOLE :
116         sgSetVec4 ( skyfogcol, 0.0, 0.0, 0.0, 1.0 ) ;
117         break ;
118       case OCEAN_ICE :
119         sgSetVec4 ( skyfogcol, 0.6, 0.6, 0.9, 1.0 ) ;
120         break ;
121       case OCEAN_WATER :
122         sgSetVec4 ( skyfogcol, 0.2, 0.4, 0.7, 1.0 ) ;
123         break ;
124       case OCEAN_LAVA :
125 	{
126 	  float t = (float)( getClock () % 240 ) ;
127 	  if ( t > 120.0 ) t = 240.0 - t ;
128 	  t /= 120.0f ;
129 	  sgSetVec4 ( skyfogcol, 0.6 * t, 0.0, 0.0, 1.0 ) ;
130 	}
131         break ;
132     }
133   }
134   else
135     sgSetVec4 ( skyfogcol, tuxState->skycol[0],
136                            tuxState->skycol[1],
137                            tuxState->skycol[2], 1.0 ) ;
138 
139   ssgGetLight ( 0 ) -> setPosition ( sunposn ) ;
140 
141   /* Clear the screen */
142 
143   glClearColor ( skyfogcol[0], skyfogcol[1], skyfogcol[2], skyfogcol[3] ) ;
144   glClear      ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
145 
146   glEnable ( GL_DEPTH_TEST ) ;
147 
148   if ( ocean && camera -> isSubmerged () )
149   {
150     switch ( ocean -> getType () )
151     {
152       case OCEAN_BLACKHOLE : glFogf ( GL_FOG_DENSITY, 0.07 ) ; break ;
153       case OCEAN_ICE       : glFogf ( GL_FOG_DENSITY, 0.07 ) ; break ;
154       case OCEAN_WATER     : glFogf ( GL_FOG_DENSITY, 0.03 ) ; break ;
155       case OCEAN_LAVA      : glFogf ( GL_FOG_DENSITY, 0.09 ) ; break ;
156     }
157   }
158   else
159     glFogf ( GL_FOG_DENSITY, 0.005 / 100.0f ) ;
160 
161   glFogfv( GL_FOG_COLOR  , skyfogcol ) ;
162   glFogf ( GL_FOG_START  , 0.0       ) ;
163   glFogi ( GL_FOG_MODE   , GL_EXP2   ) ;
164   glHint ( GL_FOG_HINT   , GL_NICEST ) ;
165 
166   glEnable ( GL_FOG ) ;
167   ssgCullAndDraw ( scene ) ;
168   glDisable ( GL_FOG ) ;
169 }
170 
171 
done()172 void GFX::done ()
173 {
174   static ulClock frame_rate_limiter ;
175 
176   frame_rate_limiter . update () ;
177 
178   float delta = frame_rate_limiter . getDeltaTime () ;
179 
180   if ( delta < 1.0f / 60.0f )
181     usleep ( (int)((1.0f/60.0f - delta) * 1000000.0f) ) ;
182 
183   glutPostRedisplay () ;
184   glutSwapBuffers () ;
185 }
186 
187