changed copyright years in source files
[fegdk.git] / core / code / video / sdl / f_sdlrenderer.cpp
bloba1e34f2b4a4d88209303557e56ecccac5315bec6
1 /*
2 fegdk: FE Game Development Kit
3 Copyright (C) 2001-2008 Alexey "waker" Yakovenko
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with this library; if not, write to the Free
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 Alexey Yakovenko
20 waker@users.sourceforge.net
23 // $Header$
24 #include "pch.h"
25 #include "config.h"
27 #include "f_types.h"
28 #include "f_sdlrenderer.h"
29 #include "f_baseviewport.h"
30 #include "f_math.h"
31 #include "f_sdlviewport.h"
32 #include "f_sdlviewportdata.h"
33 #include "f_engine.h"
34 #include "f_application.h"
35 #include "f_console.h"
36 #include "f_error.h"
37 #include "f_fragileobject.h"
38 #include "f_resourcemgr.h"
39 #include <GL/glew.h>
40 #include "f_resourcemgr.h"
41 #include "f_resourcetable.h"
42 #include <SDL/SDL.h>
43 #include <cvars.h>
45 namespace fe
48 //-----------------------------------
49 // sdlRendererData
50 //-----------------------------------
52 sdlRendererData::sdlRendererData (void)
54 // enum vidmodes
56 mbWindowed = true;
58 SDL_Rect **modes;
59 SDL_PixelFormat fmt32 = {NULL, 32, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
60 SDL_PixelFormat fmt16 = {NULL, 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
62 modes = SDL_ListModes (&fmt32, SDL_FULLSCREEN | SDL_HWSURFACE |
63 SDL_DOUBLEBUF | SDL_OPENGL);
64 addModes (modes, 32);
65 modes = SDL_ListModes (&fmt16, SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL);
66 addModes (modes, 16);
68 if (mVidModes.empty ())
69 sys_error ("no suitable video modes found!\n");
70 size_t i;
71 int mode_800x600 = -1;
72 int mode_640x480 = -1;
73 for (i = 0; i < mVidModes.size (); i++)
75 fprintf (stderr, "found vidmode %dx%dx%d\n", mVidModes[i].w, mVidModes[i].h, mVidModes[i].bpp);
76 if (mVidModes[i].w == 800 && mVidModes[i].h == 600)
77 mode_800x600 = i;
78 if (mVidModes[i].w == 640 && mVidModes[i].h == 480)
79 mode_640x480 = i;
82 mCurrentMode = 0;
83 if (mode_800x600 != -1)
84 mCurrentMode = mode_800x600;
85 else if (mode_640x480 != -1)
86 mCurrentMode = mode_640x480;
89 void sdlRendererData::reset (void)
91 SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
92 // SDL_GL_SetAttribute (SDL_GL_STENCIL_SIZE, 8);
93 SDL_GL_SetAttribute (SDL_GL_DEPTH_SIZE, 16);
95 int flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_OPENGL;
96 if (!mbWindowed)
97 flags |= SDL_FULLSCREEN;
98 SDL_SetVideoMode (mVidModes[mCurrentMode].w, mVidModes[mCurrentMode].h, mVidModes[mCurrentMode].bpp, flags);
100 // fullscreen viewport
101 glViewport (0, 0, mVidModes[mCurrentMode].w, mVidModes[mCurrentMode].h);
104 void
105 sdlRendererData::addModes (SDL_Rect **modes, int bpp)
107 if (!modes)
108 return;
110 if (modes == (void*) (-1))
111 sys_error ("SDL_ListModes returned -1. evil.");
113 for (; *modes; modes++)
115 SDL_Rect *mode = *modes;
117 size_t i;
118 for (i = 0; i < mVidModes.size (); i++)
120 if (mVidModes[i].w == mode->w && mVidModes[i].h == mode->h && mVidModes[i].bpp == bpp)
121 break;
124 if (i == mVidModes.size ())
126 vidMode_t vmode;
127 vmode.w = mode->w;
128 vmode.h = mode->h;
129 vmode.bpp = bpp;
130 mVidModes.push_back (vmode);
135 sdlRendererData::~sdlRendererData (void)
139 size_t sdlRendererData::numVidModes (void) const
141 return mVidModes.size ();
144 size_t sdlRendererData::getCurrentVidMode (void) const
146 return mCurrentMode;
149 void sdlRendererData::setCurrentVidMode (size_t mode)
151 mCurrentMode = mode;
154 const sdlRendererData::vidMode_t& sdlRendererData::getVidModeDescr (int mode) const
156 return mVidModes[mode];
159 void sdlRendererData::setWindowed (bool windowed)
161 mbWindowed = windowed;
164 sdlRenderer::sdlRenderer (void)
166 mbResetting = false;
167 /* Setup our viewport. */
168 size_t curmode = mRendererData.getCurrentVidMode ();
169 const sdlRendererData::vidMode_t &descr = mRendererData.getVidModeDescr ( (int)curmode);
171 fprintf (stderr, "SDL: setting render-related cvars...\n");
173 // set cvars
174 cvarManager *cvars = g_engine->getCVarManager ();
175 cvars->setInt ("r_fullscreen", 0, true);
176 cvars->setInt ("r_vidmode", curmode, true);
178 glRenderer::init ();
180 fprintf (stderr, "sdl_opengl renderer initialization done.\n");
183 sdlRenderer::~sdlRenderer (void)
187 void sdlRenderer::present (void)
189 SDL_GL_SwapBuffers ();
192 bool sdlRenderer::isLost (void) const
194 // for now - assume opengl buffers are restored automatically (though remember it is not really true)
195 return false;
198 void sdlRenderer::resize (void)
200 int mode = r_vidmode->ivalue;
201 int fullscreen = r_fullscreen->ivalue;
203 // set modes to rendererdata
204 mRendererData.setCurrentVidMode (mode);
205 mRendererData.setWindowed (fullscreen ? false : true);
206 mRendererData.reset ();
208 glRenderer::resize ();
211 ulong sdlRenderer::numDisplayModes (ulong adapter, ulong device) const
213 return (ulong)mRendererData.numVidModes ();
216 cStr sdlRenderer::getDisplayModeDescr (ulong adapter, ulong device, ulong mode) const
218 const sdlRendererData::vidMode_t &vmode = mRendererData.getVidModeDescr (mode);
219 cStr s;
220 s.printf ("%d x %d x %d", vmode.w, vmode.h, vmode.bpp);
221 return s;
224 ulong sdlRenderer::numDevices (ulong adapter) const
226 return 1;
229 cStr sdlRenderer::getDeviceDescr (ulong adapter, ulong device) const
231 return "SDL-opengl";
234 ulong sdlRenderer::numAdapters (void) const
236 return 1;
239 cStr sdlRenderer::getAdapterDescr (ulong adapter) const
241 return "default adapter";
244 ulong sdlRenderer::getCurrentAdapter (void) const
246 return 0;
249 ulong sdlRenderer::getCurrentDevice (ulong adapter) const
251 return 0;
254 ulong sdlRenderer::getCurrentMode (ulong adapter, ulong device) const
256 return 0;
259 void sdlRenderer::setWindow (baseViewport *vp)
261 // setting external window is not supported for opengl
262 // FIXME: should this method be completely abandoned?
266 sdlRendererData* sdlRenderer::getData (void)
268 return &mRendererData;