renamed libpg to libbear
[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
20 #include <bear/debug.h>
21 #include <bear/mathw.h>
22 using namespace bear;
23
24 #include <GL/gl.h>
25 #include <GL/glu.h>
26 #include <SDL/SDL.h>
27 #include <cmath>
28
29 #include <iostream>
30 using std::cerr;
31 using std::cout;
32 using std::endl;
33
34
35 /// ***** Private Method Headers *****
36
37 void glDrawCircle(int);
38 void glDrawPolygon( const std::vector<Vector2>& points );
39 void sdlInit();
40 void glInit();
41
42 /// ***** Initializers/Cleaners *****
43
44 void graphics::init()
45 {
46     sdlInit();
47     glInit();
48 }
49
50 void graphics::clean()
51 {
52
53 }
54
55 /// ***** Public Methods *****
56
57 void graphics::drawCircle(float radius, const Vector2& pos, const float* color)
58 {
59     glMatrixMode(GL_MODELVIEW);
60     glLoadIdentity();
61     glTranslatef(pos.m_fX, pos.m_fY, -1);
62     glScalef(radius, radius, radius);
63
64     if(color != NULL)
65         glColor3fv(color);
66
67     glDrawCircle(32);
68 }
69
70 void graphics::drawPolygon
71 (
72   const std::vector<Vector2>& points,
73   const float* color
74 )
75 {
76     glMatrixMode(GL_MODELVIEW);
77     glLoadIdentity();
78
79     if(color != NULL)
80         glColor3fv(color);
81
82     glDrawPolygon(points);
83 }
84
85 /// ***** Private Methods *****
86
87 void glDrawCircle(int pieces)
88 {
89     glBegin(GL_POLYGON);
90         for(int n = 0; n < pieces; n++)
91         {
92             float angle = 2 * PI * n / pieces;
93             float ix = cos(angle);
94             float iy = sin(angle);
95
96             glVertex3f(ix, iy, 0);
97         }
98     glEnd();
99 }
100
101 void glDrawPolygon( const std::vector<Vector2>& points )
102 {
103     glBegin(GL_POLYGON);
104         for(unsigned int n = 0; n < points.size(); n++)
105         {
106             const Vector2& vec = points.at(n);
107
108             glVertex3f(vec.m_fX, vec.m_fY, 0);
109         }
110     glEnd();
111 }
112
113 void sdlInit()
114 {
115     if(SDL_Init(SDL_INIT_VIDEO) < 0)
116     {
117         cerr << "SDL_Init failed: " << SDL_GetError() << endl;
118         exit(1);
119     }
120
121     // In order to use SDL_OPENGLBLIT we have to
122     // set GL attributes first
123     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 8);
124     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
125
126     if(SDL_SetVideoMode(800, 600, 16, SDL_OPENGL) < 0)
127     {
128         cerr << "SDL_SetVideoMode failed: " << SDL_GetError() << endl;
129         exit(1);
130     }
131 }
132
133 void glInit()
134 {
135     glClearColor(0.0, 0.0, 0.0, 0.0);
136
137     glMatrixMode(GL_PROJECTION);
138     glLoadIdentity();
139
140     glOrtho(0, 800.0, 600.0, 0.0, -0.01, 1.01);
141
142     glMatrixMode(GL_MODELVIEW);
143     glLoadIdentity();
144
145     glEnable(GL_DEPTH_TEST);
146
147     // anti aliasing?
148     /*
149     glEnable(GL_BLEND);
150     glEnable(GL_POLYGON_SMOOTH_HINT);
151
152     glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE);
153
154     glHint(GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
155     */
156 }