fix config reader bug
[physics.git] / src / graphics / graphics.cpp
1 /*
2  *  Copyright (C) 2008 Patrik Gornicz, Gornicz_P (at) hotmail (dot) com.
3  *
4  *  This program is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "graphics.h"
19 #include "../debug.h"
20
21 #include <GL/gl.h>
22 #include <GL/glu.h>
23 #include <SDL/SDL.h>
24 #include <cmath>
25
26 #include "../mathw.h"
27
28
29 /// ***** Private Method Headers *****
30
31 void glDrawCircle(int);
32 void sdlInit();
33 void glInit();
34
35 /// ***** Initializers/Cleaners *****
36
37 void graphics::init()
38 {
39     sdlInit();
40     glInit();
41 }
42
43 void graphics::clean()
44 {
45
46 }
47
48 /// ***** Public Methods *****
49
50 void graphics::drawCircle(float radius, const Vector2& pos, const float* color)
51 {
52     glMatrixMode(GL_MODELVIEW);
53     glLoadIdentity();
54     glTranslatef(pos.x, pos.y, -1);
55     glScalef(radius, radius, radius);
56
57     if(color != NULL)
58         glColor3fv(color);
59
60     glDrawCircle(32);
61 }
62
63 /// ***** Private Methods *****
64
65 void glDrawCircle(int pieces)
66 {
67     glBegin(GL_POLYGON);
68         for(int n = 0; n < pieces; n++)
69         {
70             float angle = 2 * PI * n / pieces;
71             float ix = cos(angle);
72             float iy = sin(angle);
73
74             glVertex3f(ix, iy, 0);
75         }
76     glEnd();
77 }
78
79 void sdlInit()
80 {
81     if(SDL_Init(SDL_INIT_VIDEO) < 0)
82     {
83         cerr << "SDL_Init failed: " << SDL_GetError() << endl;
84         exit(1);
85     }
86
87     // In order to use SDL_OPENGLBLIT we have to
88     // set GL attributes first
89     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
90     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
91
92     if(SDL_SetVideoMode(800, 600, 16, SDL_OPENGL) < 0)
93     {
94         cerr << "SDL_SetVideoMode failed: " << SDL_GetError() << endl;
95         exit(1);
96     }
97 }
98
99 void glInit()
100 {
101     glClearColor(0.0, 0.0, 0.0, 0.0);
102
103     glMatrixMode(GL_PROJECTION);
104     glLoadIdentity();
105
106     glOrtho(0, 800.0, 600.0, 0.0, -0.01, 1.01);
107
108     glMatrixMode(GL_MODELVIEW);
109     glLoadIdentity();
110
111     glEnable(GL_DEPTH_TEST);
112
113     // anti aliasing?
114     /*
115     glEnable(GL_BLEND);
116     glEnable(GL_POLYGON_SMOOTH_HINT);
117
118     glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE);
119
120     glHint(GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
121     */
122 }