use gl3w instead of glew; render map with shaders
This commit is contained in:
parent
2569e3a007
commit
46c9a81c11
14
SConstruct
14
SConstruct
@ -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)
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -2,7 +2,7 @@
|
||||
#ifndef GLBUFFER_H
|
||||
#define GLBUFFER_H
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include GL_INCLUDE_FILE
|
||||
|
||||
class GLBuffer
|
||||
{
|
||||
|
@ -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
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
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
1146
src/client/GL3/gl3w.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user