Added movement controls
This commit is contained in:
parent
d9f44af7ae
commit
a407f8b9ed
5 changed files with 62 additions and 32 deletions
|
@ -2,7 +2,6 @@ uniform sampler2D tex;
|
||||||
|
|
||||||
varying vec4 diffuse, ambientGlobal, ambient;
|
varying vec4 diffuse, ambientGlobal, ambient;
|
||||||
varying vec3 normal, pos;
|
varying vec3 normal, pos;
|
||||||
/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
|
@ -1,22 +1,14 @@
|
||||||
varying vec4 diffuse, ambientGlobal, ambient;
|
varying vec4 diffuse, ambientGlobal, ambient;
|
||||||
varying vec3 normal, pos;
|
varying vec3 normal, pos;
|
||||||
/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
normal = normalize(gl_NormalMatrix * gl_Normal);
|
normal = normalize(gl_NormalMatrix * gl_Normal);
|
||||||
|
|
||||||
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
|
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
|
||||||
/*lightVector = vec3(gl_LightSource[0].position - ecPos);
|
|
||||||
|
|
||||||
reflectVector = normalize(reflect(-lightVector, normal));
|
|
||||||
eyeVector = vec3(-ecPos);*/
|
|
||||||
|
|
||||||
/* Compute the diffuse, ambient and globalAmbient terms */
|
|
||||||
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
|
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
|
||||||
|
|
||||||
/* The ambient terms have been separated since one of them */
|
|
||||||
/* suffers attenuation */
|
|
||||||
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
|
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
|
||||||
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
|
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
|
||||||
|
|
||||||
|
|
44
src/Game.cpp
44
src/Game.cpp
|
@ -27,7 +27,8 @@
|
||||||
|
|
||||||
namespace Zoom {
|
namespace Zoom {
|
||||||
|
|
||||||
Game::Game(bool multisample) : angle(0), lightPos(0) {
|
Game::Game(bool multisample) : playerPos(vmml::vec3f::ZERO), playerRot(vmml::mat4f::IDENTITY),
|
||||||
|
input(NONE), lightPos(0) {
|
||||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||||
glClearDepth(1.0);
|
glClearDepth(1.0);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
@ -41,14 +42,12 @@ Game::Game(bool multisample) : angle(0), lightPos(0) {
|
||||||
glEnable(GL_MULTISAMPLE_ARB);
|
glEnable(GL_MULTISAMPLE_ARB);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
glShadeModel(GL_SMOOTH);
|
|
||||||
|
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
glLightfv(GL_LIGHT0, GL_AMBIENT, vmml::vec4f::ZERO.array);
|
glLightfv(GL_LIGHT0, GL_AMBIENT, vmml::vec4f::ZERO.array);
|
||||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, vmml::vec4f::ONE.array);
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, vmml::vec4f::ONE.array);
|
||||||
glLightfv(GL_LIGHT0, GL_SPECULAR, vmml::vec4f::ONE.array);
|
glLightfv(GL_LIGHT0, GL_SPECULAR, vmml::vec4f::ONE.array);
|
||||||
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0);
|
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0);
|
||||||
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.3);
|
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.2);
|
||||||
glEnable(GL_LIGHT0);
|
glEnable(GL_LIGHT0);
|
||||||
|
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
glEnable(GL_COLOR_MATERIAL);
|
||||||
|
@ -62,6 +61,8 @@ Game::Game(bool multisample) : angle(0), lightPos(0) {
|
||||||
|
|
||||||
Shader::loadProgram("default.vert", "default.frag");
|
Shader::loadProgram("default.vert", "default.frag");
|
||||||
|
|
||||||
|
playerRot.rotate_y(M_PI/6);
|
||||||
|
|
||||||
loadLevel("level.xml");
|
loadLevel("level.xml");
|
||||||
triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end());
|
triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end());
|
||||||
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());
|
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());
|
||||||
|
@ -74,13 +75,21 @@ bool Game::loadLevel(const std::string &name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::run(int delta) {
|
void Game::run(int delta) {
|
||||||
angle += delta*0.01;
|
|
||||||
|
|
||||||
if(angle >= 360)
|
|
||||||
angle -= 360;
|
|
||||||
|
|
||||||
lightPos += delta;
|
lightPos += delta;
|
||||||
lightPos %= 24000;
|
lightPos %= 24000;
|
||||||
|
|
||||||
|
if(input & FORWARD) {
|
||||||
|
playerPos -= playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
|
||||||
|
}
|
||||||
|
if(input & BACKWARD) {
|
||||||
|
playerPos += playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
|
||||||
|
}
|
||||||
|
if(input & LEFT) {
|
||||||
|
playerPos -= playerRot*vmml::vec3f::UNIT_X*0.01*delta;
|
||||||
|
}
|
||||||
|
if(input & RIGHT) {
|
||||||
|
playerPos += playerRot*vmml::vec3f::UNIT_X*0.01*delta;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Game::render() {
|
void Game::render() {
|
||||||
|
@ -107,23 +116,16 @@ void Game::render() {
|
||||||
light[2] = -8.0;
|
light[2] = -8.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*std::vector<BSPTree::TriangleRecord> triangles(level->getRooms().front().walls.begin(),
|
|
||||||
level->getRooms().front().walls.end());
|
|
||||||
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());*/
|
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glPushMatrix();
|
vmml::mat4f transform(playerRot), inverse;
|
||||||
glRotatef(15, 1, 2, 1);
|
transform.set_translation(playerPos);
|
||||||
/*glRotatef(5*angle, 0, -1, 2);
|
transform.inverse(inverse);
|
||||||
glRotatef(7*angle, 2, -1, 0);
|
|
||||||
glRotatef(11*angle, 2, -1, 2);*/
|
glLoadMatrixf(inverse.array);
|
||||||
|
|
||||||
glLightfv(GL_LIGHT0, GL_POSITION, light);
|
glLightfv(GL_LIGHT0, GL_POSITION, light);
|
||||||
//renderer.render(std::list<BSPTree::TriangleRecord>(triangles.begin(), triangles.end()));
|
|
||||||
renderer.render(triangles);
|
renderer.render(triangles);
|
||||||
|
|
||||||
glPopMatrix();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
18
src/Game.h
18
src/Game.h
|
@ -31,10 +31,22 @@ class Triangle;
|
||||||
|
|
||||||
class Game {
|
class Game {
|
||||||
public:
|
public:
|
||||||
|
enum Input {
|
||||||
|
NONE = 0,
|
||||||
|
FORWARD = (1 << 0),
|
||||||
|
BACKWARD = (1 << 1),
|
||||||
|
LEFT = (1 << 2),
|
||||||
|
RIGHT = (1 << 3)
|
||||||
|
};
|
||||||
|
|
||||||
Game(bool multisample);
|
Game(bool multisample);
|
||||||
|
|
||||||
bool loadLevel(const std::string &name);
|
bool loadLevel(const std::string &name);
|
||||||
|
|
||||||
|
void setInput(unsigned input) {
|
||||||
|
this->input = static_cast<Input>(input);
|
||||||
|
}
|
||||||
|
|
||||||
void run(int delta);
|
void run(int delta);
|
||||||
void render();
|
void render();
|
||||||
|
|
||||||
|
@ -44,7 +56,11 @@ class Game {
|
||||||
boost::shared_ptr<Level> level;
|
boost::shared_ptr<Level> level;
|
||||||
std::vector<BSPTree::TriangleRecord> triangles;
|
std::vector<BSPTree::TriangleRecord> triangles;
|
||||||
|
|
||||||
float angle;
|
vmml::vec3f playerPos;
|
||||||
|
vmml::mat4f playerRot;
|
||||||
|
|
||||||
|
Input input;
|
||||||
|
|
||||||
int lightPos;
|
int lightPos;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
23
src/zoom.cpp
23
src/zoom.cpp
|
@ -272,7 +272,7 @@ bool GLXinit(Display *disp, Atom windele, Window *wnd, GLXContext *gc, bool *mul
|
||||||
XSetWindowAttributes swa;
|
XSetWindowAttributes swa;
|
||||||
swa.colormap = cmap;
|
swa.colormap = cmap;
|
||||||
swa.border_pixel = 0;
|
swa.border_pixel = 0;
|
||||||
swa.event_mask = StructureNotifyMask/* | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask*/;
|
swa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask/* | PointerMotionMask | ButtonPressMask | ButtonReleaseMask*/;
|
||||||
|
|
||||||
*wnd = XCreateWindow(disp, RootWindow(disp, vi->screen), 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, vi->depth, InputOutput,
|
*wnd = XCreateWindow(disp, RootWindow(disp, vi->screen), 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, vi->depth, InputOutput,
|
||||||
vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa);
|
vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa);
|
||||||
|
@ -336,6 +336,7 @@ int main() {
|
||||||
|
|
||||||
unsigned long delta = 0;
|
unsigned long delta = 0;
|
||||||
unsigned long frames = 0, tocks = 0;
|
unsigned long frames = 0, tocks = 0;
|
||||||
|
unsigned input = 0;
|
||||||
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
|
@ -353,11 +354,31 @@ int main() {
|
||||||
case ClientMessage:
|
case ClientMessage:
|
||||||
if(static_cast<Atom>(event.xclient.data.l[0]) == windele)
|
if(static_cast<Atom>(event.xclient.data.l[0]) == windele)
|
||||||
running = false;
|
running = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KeyPress:
|
||||||
|
switch(XKeycodeToKeysym(disp, event.xkey.keycode, 0)) {
|
||||||
|
case XK_Up: case XK_w: input |= Zoom::Game::FORWARD; break;
|
||||||
|
case XK_Down: case XK_s: input |= Zoom::Game::BACKWARD; break;
|
||||||
|
case XK_Left: case XK_a: input |= Zoom::Game::LEFT; break;
|
||||||
|
case XK_Right: case XK_d: input |= Zoom::Game::RIGHT; break;
|
||||||
|
case XK_Escape: running = false; break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case KeyRelease:
|
||||||
|
switch(XKeycodeToKeysym(disp, event.xkey.keycode, 0)) {
|
||||||
|
case XK_Up: case XK_w: input &= ~Zoom::Game::FORWARD; break;
|
||||||
|
case XK_Down: case XK_s: input &= ~Zoom::Game::BACKWARD; break;
|
||||||
|
case XK_Left: case XK_a: input &= ~Zoom::Game::LEFT; break;
|
||||||
|
case XK_Right: case XK_d: input &= ~Zoom::Game::RIGHT; break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!running) break;
|
if(!running) break;
|
||||||
|
|
||||||
|
game.setInput(input);
|
||||||
game.run(delta);
|
game.run(delta);
|
||||||
|
|
||||||
game.render();
|
game.render();
|
||||||
|
|
Reference in a new issue