Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: cc402ff08cac246cdca3d92bffc7e8861d151bc7 (plain)
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