1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*
render/state.cc
This file is part of the Osirion project and is distributed under
the terms of the GNU General Public License version 2
*/
#include <string>
#include <sstream>
#include "render/state.h"
#include "render/gl.h"
#include "render/render.h"
namespace render {
int State::render_width = 0;
int State::render_height = 0;
float State::render_aspect = 0;
bool State::render_has_generate_mipmaps = 0;
void State::init(int width, int height)
{
resize(width, height);
render_has_generate_mipmaps = false;
std::string version(gl::version());
for (size_t i =0; i < version.size(); i++) {
if (version[i] == '.')
version[i] = ' ';
}
std::stringstream versionstream(version);
int major, minor;
if (versionstream >> major >> minor) {
if (major > 1) {
render_has_generate_mipmaps = true;
} else if (major == 1) {
if (minor >3)
render_has_generate_mipmaps = true;
}
} else {
con_warn << "Could not determine OpenGL version!" << std::endl;
}
}
void State::shutdown()
{
}
void State::resize(int width, int height)
{
render_width = width;
render_height = height;
render_aspect = (float) width / (float) height;
clear();
}
void State::clear()
{
// set viewport
gl::viewport(0, 0, render_width, render_height);
// set clear color
gl::clearcolor(0.0f, 0.0f, 0.0f, 1.0f);
// load identity matrices
gl::matrixmode(GL_PROJECTION);
gl::loadidentity();
gl::matrixmode(GL_MODELVIEW);
gl::loadidentity();
// shading model: Gouraud (smooth, the default)
gl::shademodel(GL_SMOOTH);
//gl::shademodel(GL_FLAT);
// lighting settings for the default light GL_LIGHT0
GLfloat light_position[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat ambient_light[] = { 0.01f, 0.01f, 0.01f, 1.0f };
GLfloat diffuse_light[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat specular_light[] = { 0.2f, 0.2f, 0.2f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light);
// GL_LIGHT0 is always enabled
gl::enable(GL_LIGHT0);
// color tracking
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
// material settings
GLfloat specular_reflectance[] = { 0.2f, 0.2f, 0.2f, 1.0f };
glMaterialfv(GL_FRONT, GL_SPECULAR, specular_reflectance);
glMateriali(GL_FRONT, GL_SHININESS, 128); // shininess 1-128
// alpha blending function
gl::blendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
gl::disable(GL_LIGHTING);
gl::disable(GL_COLOR_MATERIAL);
gl::cullface(GL_BACK);
gl::frontface(GL_CCW);
gl::disable(GL_CULL_FACE);
gl::disable(GL_DEPTH_TEST);
gl::disable(GL_BLEND);
gl::disable(GL_TEXTURE_2D);
}
} // namespace render
|