use gl3w instead of glew; render map with shaders

This commit is contained in:
Josh Holtrop 2012-09-11 19:16:08 -04:00
parent 2569e3a007
commit 46c9a81c11
8 changed files with 6091 additions and 56 deletions

View File

@ -49,7 +49,7 @@ LIBPATH = ['%s/lib' % SFML_PATH]
CPPFLAGS = []
CPPFLAGS += map(lambda x: '-I' + x, find_dirs_under('src/common'))
CPPFLAGS_client = ['-I%s/include' % SFML_PATH,
'-DGL_INCLUDE_FILE=\\"GL/glew.h\\"']
'-DGL_INCLUDE_FILE=\\"GL3/gl3w.h\\"']
CPPFLAGS_client += map(lambda x: '-I' + x, find_dirs_under('src/client'))
CPPFLAGS_server = map(lambda x: '-I' + x, find_dirs_under('src/server'))
@ -59,22 +59,14 @@ if platform == 'windows':
CC = 'i686-pc-mingw32-gcc'
MINGW_DIR = '/usr/i686-pc-mingw32/sys-root/mingw/bin'
LIBS_client += ['sfml-graphics-s', 'sfml-window-s', 'sfml-system-s',
'sfml-network-s', 'glew32', 'opengl32', 'glu32', 'mingw32']
'sfml-network-s', 'opengl32', 'glu32', 'mingw32']
LIBS_server += ['sfml-network-s', 'mingw32']
LINKFLAGS.append('-static-libstdc++')
libs_to_copy.append('%s/libgcc_s_dw2-1.dll' % MINGW_DIR)
CPPFLAGS.append('-DSFML_STATIC')
CPPFLAGS.append('-DGLEW_STATIC')
GLEW_VERSION = '1.9.0'
GLEW_PATH = '/c/apps/glew-%s' % GLEW_VERSION
if 'GLEW_PATH' in os.environ:
GLEW_PATH = os.environ['GLEW_PATH']
CPPFLAGS.append('-I%s/include' % GLEW_PATH)
LIBPATH.append('%s/lib' % GLEW_PATH)
libs_to_copy.append('%s/bin/glew32.dll' % GLEW_PATH)
else:
LIBS_client += ['sfml-network', 'sfml-window', 'sfml-graphics',
'sfml-system', 'GLEW', 'GL', 'GLU']
'sfml-system', 'GL', 'GLU']
LIBS_server += ['sfml-network']
LINKFLAGS.append('-Wl,-R%s/lib' % SFML_PATH)

View File

@ -1,6 +1,7 @@
#include <cassert>
#include <math.h>
#include <GL/glew.h>
#include GL_INCLUDE_FILE
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
@ -38,10 +39,13 @@ Client::Client(bool fullscreen, bool compatibility_context,
sf::ContextSettings cs = sf::ContextSettings(0, 0, antialias_level,
opengl_major, opengl_minor);
m_window = new sf::Window(mode, "Treacherous Terrain", style, cs);
GLenum err = glewInit();
if (err != GLEW_OK)
if (gl3wInit())
{
cerr << "GLEW Initialization error: " << glewGetErrorString(err) << endl;
cerr << "Failed to initialize GL3W" << endl;
}
if (!gl3wIsSupported(3, 0))
{
cerr << "OpenGL 3.0 is not supported!" << endl;
}
initgl();
resize_window(m_window->getSize().x, m_window->getSize().y);
@ -69,6 +73,20 @@ Client::Client(bool fullscreen, bool compatibility_context,
{
cerr << "Error loading tank model" << endl;
}
static const struct
{
GLfloat pos[3];
GLfloat normal[3];
} tile_attribs[] = {
{{0.5, 0.5, 0}, {0, 0, 1}},
{{-0.5, 0.5, 0}, {0, 0, 1}},
{{-0.5, -0.5, 0}, {0, 0, 1}},
{{0.5, -0.5, 0}, {0, 0, 1}}
};
assert(sizeof(tile_attribs) == sizeof(GLfloat) * 6 * 4);
m_tile_buffer.create(GL_ARRAY_BUFFER, GL_STATIC_DRAW, &tile_attribs, sizeof(tile_attribs));
static const GLushort tile_indices[] = {0, 1, 2, 3};
m_tile_index_buffer.create(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW, &tile_indices, sizeof(tile_indices));
}
void Client::run()
@ -112,11 +130,6 @@ void Client::run()
double dir_x = cos(m_player->direction);
double dir_y = sin(m_player->direction);
glLoadIdentity();
gluLookAt(m_player->x - dir_x * 100, m_player->y - dir_y * 100, 150,
m_player->x, m_player->y, 100,
0, 0, 1);
m_modelview.load_identity();
m_modelview.look_at(
m_player->x - dir_x * 100, m_player->y - dir_y * 100, 150,
@ -133,10 +146,8 @@ void Client::run()
void Client::initgl()
{
glShadeModel(GL_SMOOTH);
glDisable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
glPolygonOffset(0, -2);
glPolygonOffset(1, 1);
}
void Client::resize_window(int width, int height)
@ -146,12 +157,8 @@ void Client::resize_window(int width, int height)
sf::Mouse::setPosition(sf::Vector2i(m_width / 2, m_height / 2), *m_window);
glViewport(0, 0, width, height);
float aspect = (float)width / (float)height;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, aspect, 1.0f, 5000.0f);
m_projection.load_identity();
m_projection.perspective(60.0f, aspect, 1.0f, 5000.0f);
glMatrixMode(GL_MODELVIEW);
}
void Client::update(double elapsed_time)
@ -194,7 +201,7 @@ void Client::draw_players()
m_modelview.push();
m_modelview.translate(m_player->x, m_player->y, 40);
m_modelview.rotate(m_player->direction * 180.0 / M_PI, 0, 0, 1);
glUseProgram(m_obj_program.get_id());
m_obj_program.use();
m_tank_obj.bindBuffers();
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
@ -242,39 +249,45 @@ void Client::draw_map()
{
const int width = m_map.get_width();
const int height = m_map.get_height();
const float span_x = 50;
const float span_y = 50;
glPushAttrib(GL_POLYGON_BIT);
glEnable(GL_POLYGON_OFFSET_LINE);
glPushMatrix();
const float tile_size = 50;
GLint uniform_locations[7];
const char *uniforms[] = { "ambient", "diffuse", "specular", "shininess", "scale", "projection", "modelview" };
m_obj_program.get_uniform_locations(uniforms, 7, uniform_locations);
m_obj_program.use();
glUniform1f(uniform_locations[4], tile_size);
m_projection.to_uniform(uniform_locations[5]);
m_tile_buffer.bind();
m_tile_index_buffer.bind();
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,
6u * sizeof(GLfloat), (GLvoid *) 0u);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,
6u * sizeof(GLfloat), (GLvoid *) (3u * sizeof(GLfloat)));
glEnable(GL_POLYGON_OFFSET_FILL);
glUniform1f(uniform_locations[3], 2);
GLfloat ambient[] = {1, 1, 1, 1};
glUniform4fv(uniform_locations[0], 1, &ambient[0]);
GLfloat tile_diffuse[] = {0.4, 0.4, 0.4, 1};
GLfloat tile_highlight[] = {1, 1, 1, 1};
GLfloat specular[] = {1, 1, 1, 1};
glUniform4fv(uniform_locations[2], 1, &specular[0]);
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (m_map.tile_present(x, y))
{
glPushMatrix();
glTranslatef(span_x * x, span_y * y, 0);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_QUADS);
glColor3f(0.4, 0.4, 0.4);
glVertex2f(span_x, span_y);
glVertex2f(0, span_y);
glVertex2f(0, 0);
glVertex2f(span_x, 0);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glVertex2f(span_x, span_y);
glVertex2f(0, span_y);
glVertex2f(0, 0);
glVertex2f(span_x, 0);
glEnd();
glPopMatrix();
m_modelview.push();
m_modelview.translate(tile_size * x, tile_size * y, 0);
m_modelview.to_uniform(uniform_locations[6]);
glUniform4fv(uniform_locations[1], 1, &tile_diffuse[0]);
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_SHORT, NULL);
glUniform4fv(uniform_locations[1], 1, &tile_highlight[0]);
glDrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, NULL);
m_modelview.pop();
}
}
}
glPopMatrix();
glPopAttrib();
glDisable(GL_POLYGON_OFFSET_LINE);
}

View File

@ -9,6 +9,7 @@
#include "GLProgram.h"
#include "WFObj.h"
#include "GLMatrix.h"
#include "GLBuffer.h"
class Client
{
@ -32,6 +33,8 @@ class Client
WFObj m_tank_obj;
GLMatrix m_projection;
GLMatrix m_modelview;
GLBuffer m_tile_buffer;
GLBuffer m_tile_index_buffer;
};
#endif

View File

@ -2,7 +2,7 @@
#ifndef GLBUFFER_H
#define GLBUFFER_H
#include <GL/glew.h>
#include GL_INCLUDE_FILE
class GLBuffer
{

View File

@ -2,7 +2,7 @@
#ifndef GLSHADER_H
#define GLSHADER_H
#include <GL/glew.h>
#include GL_INCLUDE_FILE
class GLShader
{

3630
src/client/GL3/gl3.h Normal file

File diff suppressed because it is too large Load Diff

1251
src/client/GL3/gl3w.c Normal file

File diff suppressed because it is too large Load Diff

1146
src/client/GL3/gl3w.h Normal file

File diff suppressed because it is too large Load Diff