Added movement controls

This commit is contained in:
Matthias Schiffer 2009-12-15 22:42:49 +01:00
parent d9f44af7ae
commit a407f8b9ed
5 changed files with 62 additions and 32 deletions

View file

@ -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() {

View file

@ -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;

View file

@ -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();
} }
} }

View file

@ -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;
}; };

View file

@ -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();