]> icculus.org git repositories - taylor/freespace2.git/blob - src/graphics/grwxgl.cpp
add gr_stream_*() for movie playback
[taylor/freespace2.git] / src / graphics / grwxgl.cpp
1 /*
2  * Copyright (C) Volition, Inc. 1999.  All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on
6  * the source.
7  */
8
9 #include "SDL_opengl.h"
10
11 #include "pstypes.h"
12 #include "2d.h"
13 #include "grwxgl.h"
14 #include "gropengl.h"
15 #include "gropenglinternal.h"
16 #include "grgl1.h"
17 #include "grinternal.h"
18 #include "mouse.h"
19
20
21 extern bool OGL_inited;
22 extern int GL_one_inited;
23
24 extern void opengl_set_variables();
25 extern void opengl_init_viewport();
26
27
28 static void wxgl_init_func_pointers()
29 {
30         gr_screen.gf_flip = gr_wxgl_flip;
31         gr_screen.gf_set_clip = gr_opengl1_set_clip;
32         gr_screen.gf_reset_clip = gr_opengl_reset_clip;
33
34         gr_screen.gf_clear = gr_opengl_clear;
35
36         gr_screen.gf_aabitmap = gr_opengl1_aabitmap;
37         gr_screen.gf_aabitmap_ex = gr_opengl1_aabitmap_ex;
38
39         gr_screen.gf_rect = gr_opengl1_rect;
40         gr_screen.gf_shade = gr_opengl1_shade;
41         gr_screen.gf_string = gr_opengl1_string;
42         gr_screen.gf_circle = gr_opengl1_circle;
43
44         gr_screen.gf_line = gr_opengl1_line;
45         gr_screen.gf_aaline = gr_opengl1_aaline;
46         gr_screen.gf_pixel = gr_opengl1_pixel;
47         gr_screen.gf_scaler = gr_opengl1_scaler;
48         gr_screen.gf_tmapper = gr_opengl1_tmapper;
49
50         gr_screen.gf_gradient = gr_opengl1_gradient;
51
52         gr_screen.gf_print_screen = gr_opengl_print_screen;
53
54         gr_screen.gf_fade_in = gr_opengl1_fade_in;
55         gr_screen.gf_fade_out = gr_opengl1_fade_out;
56         gr_screen.gf_flash = gr_opengl1_flash;
57
58         gr_screen.gf_zbuffer_clear = gr_opengl1_zbuffer_clear;
59
60         gr_screen.gf_save_screen = gr_opengl1_save_screen;
61         gr_screen.gf_restore_screen = gr_opengl1_restore_screen;
62         gr_screen.gf_free_screen = gr_opengl1_free_screen;
63
64         gr_screen.gf_dump_frame_start = gr_opengl1_dump_frame_start;
65         gr_screen.gf_dump_frame_stop = gr_opengl1_dump_frame_stop;
66         gr_screen.gf_dump_frame = gr_opengl1_dump_frame;
67
68         gr_screen.gf_stream_start = gr_opengl1_stream_start;
69         gr_screen.gf_stream_frame = gr_opengl1_stream_frame;
70         gr_screen.gf_stream_stop = gr_opengl1_stream_stop;
71
72         gr_screen.gf_set_gamma = gr_opengl1_set_gamma;
73
74         gr_screen.gf_lock = gr_opengl_lock;
75         gr_screen.gf_unlock = gr_opengl_unlock;
76
77         gr_screen.gf_fog_set = gr_opengl1_fog_set;
78
79         gr_screen.gf_get_region = gr_opengl1_get_region;
80
81         gr_screen.gf_set_cull = gr_opengl_set_cull;
82
83         gr_screen.gf_cross_fade = gr_opengl1_cross_fade;
84
85         gr_screen.gf_preload_init = gr_opengl1_preload_init;
86         gr_screen.gf_preload = gr_opengl1_preload;
87
88         gr_screen.gf_zbias = gr_opengl_zbias;
89
90         gr_screen.gf_force_windowed = gr_opengl_force_windowed;
91         gr_screen.gf_force_fullscreen = gr_opengl_force_fullscreen;
92         gr_screen.gf_toggle_fullscreen = gr_opengl_toggle_fullscreen;
93
94         gr_screen.gf_set_viewport = gr_wxgl_set_viewport;
95
96         gr_screen.gf_activate = gr_opengl_activate;
97
98         gr_screen.gf_release_texture = gr_opengl1_release_texture;
99 }
100
101 static void wxgl_init()
102 {
103         if (GL_one_inited) {
104                 return;
105         }
106
107         glShadeModel(GL_SMOOTH);
108         glEnable(GL_DITHER);
109         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
110         glHint(GL_FOG_HINT, GL_NICEST);
111
112         glEnable(GL_DEPTH_TEST);
113         glEnable(GL_BLEND);
114
115         glEnable(GL_TEXTURE_2D);
116
117         glDepthRange(0.0, 1.0);
118
119         glPixelStorei(GL_PACK_ALIGNMENT, 1);
120         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
121
122         glFlush();
123
124         wxgl_init_func_pointers();
125         opengl1_tcache_init();
126
127         gr_opengl_clear();
128
129         GL_one_inited = 1;
130
131 }
132
133 void gr_wxgl_flip()
134 {
135 }
136
137 void gr_wxgl_set_viewport(int width, int height)
138 {
139         GL_viewport_x = 0;
140         GL_viewport_y = 0;
141         GL_viewport_w = width;
142         GL_viewport_h = height;
143         GL_viewport_scale_w = 1.0f;
144         GL_viewport_scale_h = 1.0f;
145
146         glViewport(GL_viewport_x, GL_viewport_y, GL_viewport_w, GL_viewport_h);
147
148         glMatrixMode(GL_PROJECTION);
149         glLoadIdentity();
150         glOrtho(0, GL_viewport_w, GL_viewport_h, 0, 0.0, 1.0);
151         glMatrixMode(GL_MODELVIEW);
152         glLoadIdentity();
153         glScalef(GL_viewport_scale_w, GL_viewport_scale_h, 1.0f);
154
155         // update gr_screen, which will deal with view scaling too
156         gr_screen.max_w = width;
157         gr_screen.max_h = height;
158 }
159
160 void gr_wxgl_cleanup()
161 {
162         gr_opengl_cleanup();
163 }
164
165 void gr_wxgl_init()
166 {
167         if ( OGL_inited )       {
168                 gr_opengl_cleanup();
169                 OGL_inited = false;
170         }
171
172         mprintf(( "Setting up OpenGL for wxWidgets...\n" ));
173
174         OGL_inited = true;
175
176         const char *gl_version = (const char*)glGetString(GL_VERSION);
177         int v_major = 0, v_minor = 0;
178
179         sscanf(gl_version, "%d.%d", &v_major, &v_minor);
180
181         GL_version = (v_major * 10) + v_minor;
182
183         // version check, require 1.2+ for sake of simplicity
184         if (GL_version < 12) {
185                 Error(LOCATION, "Minimum OpenGL version is 1.2!");
186         }
187
188         mprintf(("  Vendor   : %s\n", glGetString(GL_VENDOR)));
189         mprintf(("  Renderer : %s\n", glGetString(GL_RENDERER)));
190         mprintf(("  Version  : %s\n", gl_version));
191
192         // initial viewport setup
193         opengl_init_viewport();
194
195         // set up generic variables before further init() calls
196         opengl_set_variables();
197
198         // main GL init
199         wxgl_init();
200
201         mprintf(("\n"));
202
203
204         gr_screen.bits_per_pixel = 16;
205         gr_screen.bytes_per_pixel = 2;
206
207         // screen values
208         Gr_red.bits = 5;
209         Gr_red.shift = 10;
210         Gr_red.scale = 8;
211         Gr_red.mask = 0x7C00;
212
213         Gr_green.bits = 5;
214         Gr_green.shift = 5;
215         Gr_green.scale = 8;
216         Gr_green.mask = 0x3E0;
217
218         Gr_blue.bits = 5;
219         Gr_blue.shift = 0;
220         Gr_blue.scale = 8;
221         Gr_blue.mask = 0x1F;
222
223         Gr_alpha.bits = 1;
224         Gr_alpha.shift = 15;
225         Gr_alpha.scale = 255;
226         Gr_alpha.mask = 0x8000;
227
228         // DDOI - set these so no one else does!
229         // texture values, always 1555 - 16-bit
230         Gr_t_red.mask = 0x7C00;
231         Gr_t_red.shift = 10;
232         Gr_t_red.scale = 8;
233
234         Gr_t_green.mask = 0x3E0;
235         Gr_t_green.shift = 5;
236         Gr_t_green.scale = 8;
237
238         Gr_t_blue.mask = 0x1F;
239         Gr_t_blue.shift = 0;
240         Gr_t_blue.scale = 8;
241
242         Gr_t_alpha.mask = 0x8000;
243         Gr_t_alpha.scale = 255;
244         Gr_t_alpha.shift = 15;
245
246         // alpha-texture values
247         Gr_ta_red.mask = 0x0f00;
248         Gr_ta_red.shift = 8;
249         Gr_ta_red.scale = 16;
250
251         Gr_ta_green.mask = 0x00f0;
252         Gr_ta_green.shift = 4;
253         Gr_ta_green.scale = 16;
254
255         Gr_ta_blue.mask = 0x000f;
256         Gr_ta_blue.shift = 0;
257         Gr_ta_blue.scale = 16;
258
259         Gr_ta_alpha.mask = 0xf000;
260         Gr_ta_alpha.shift = 12;
261         Gr_ta_alpha.scale = 16;
262
263         // default to screen
264         Gr_current_red = &Gr_red;
265         Gr_current_blue = &Gr_blue;
266         Gr_current_green = &Gr_green;
267         Gr_current_alpha = &Gr_alpha;
268
269
270         Mouse_hidden++;
271         gr_reset_clip();
272         gr_clear();
273         gr_flip();
274         gr_clear();
275 }