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