From a407f8b9edbc7a6e865b2daf65b2a6cd10edd2d7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 15 Dec 2009 22:42:49 +0100 Subject: Added movement controls --- shader/default.frag | 1 - shader/default.vert | 8 -------- src/Game.cpp | 44 +++++++++++++++++++++++--------------------- src/Game.h | 18 +++++++++++++++++- src/zoom.cpp | 23 ++++++++++++++++++++++- 5 files changed, 62 insertions(+), 32 deletions(-) diff --git a/shader/default.frag b/shader/default.frag index b39b46d..e2acad0 100644 --- a/shader/default.frag +++ b/shader/default.frag @@ -2,7 +2,6 @@ uniform sampler2D tex; varying vec4 diffuse, ambientGlobal, ambient; varying vec3 normal, pos; -/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/ void main() { diff --git a/shader/default.vert b/shader/default.vert index 133c871..00b8118 100644 --- a/shader/default.vert +++ b/shader/default.vert @@ -1,22 +1,14 @@ varying vec4 diffuse, ambientGlobal, ambient; varying vec3 normal, pos; -/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/ void main() { normal = normalize(gl_NormalMatrix * gl_Normal); 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; - /* The ambient terms have been separated since one of them */ - /* suffers attenuation */ ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient; ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient; diff --git a/src/Game.cpp b/src/Game.cpp index c738080..d4991ed 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -27,7 +27,8 @@ 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); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); @@ -41,14 +42,12 @@ Game::Game(bool multisample) : angle(0), lightPos(0) { glEnable(GL_MULTISAMPLE_ARB); #endif - glShadeModel(GL_SMOOTH); - glEnable(GL_LIGHTING); glLightfv(GL_LIGHT0, GL_AMBIENT, vmml::vec4f::ZERO.array); glLightfv(GL_LIGHT0, GL_DIFFUSE, vmml::vec4f::ONE.array); glLightfv(GL_LIGHT0, GL_SPECULAR, vmml::vec4f::ONE.array); 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_COLOR_MATERIAL); @@ -62,6 +61,8 @@ Game::Game(bool multisample) : angle(0), lightPos(0) { Shader::loadProgram("default.vert", "default.frag"); + playerRot.rotate_y(M_PI/6); + loadLevel("level.xml"); triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end()); std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter()); @@ -74,13 +75,21 @@ bool Game::loadLevel(const std::string &name) { } void Game::run(int delta) { - angle += delta*0.01; - - if(angle >= 360) - angle -= 360; - lightPos += delta; 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() { @@ -107,23 +116,16 @@ void Game::render() { light[2] = -8.0; } - /*std::vector 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); - glPushMatrix(); - glRotatef(15, 1, 2, 1); - /*glRotatef(5*angle, 0, -1, 2); - glRotatef(7*angle, 2, -1, 0); - glRotatef(11*angle, 2, -1, 2);*/ + vmml::mat4f transform(playerRot), inverse; + transform.set_translation(playerPos); + transform.inverse(inverse); + + glLoadMatrixf(inverse.array); glLightfv(GL_LIGHT0, GL_POSITION, light); - //renderer.render(std::list(triangles.begin(), triangles.end())); renderer.render(triangles); - - glPopMatrix(); } } diff --git a/src/Game.h b/src/Game.h index 0fe7233..a81c7f5 100644 --- a/src/Game.h +++ b/src/Game.h @@ -31,10 +31,22 @@ class Triangle; class Game { public: + enum Input { + NONE = 0, + FORWARD = (1 << 0), + BACKWARD = (1 << 1), + LEFT = (1 << 2), + RIGHT = (1 << 3) + }; + Game(bool multisample); bool loadLevel(const std::string &name); + void setInput(unsigned input) { + this->input = static_cast(input); + } + void run(int delta); void render(); @@ -44,7 +56,11 @@ class Game { boost::shared_ptr level; std::vector triangles; - float angle; + vmml::vec3f playerPos; + vmml::mat4f playerRot; + + Input input; + int lightPos; }; diff --git a/src/zoom.cpp b/src/zoom.cpp index 6fab527..d9df6d4 100644 --- a/src/zoom.cpp +++ b/src/zoom.cpp @@ -272,7 +272,7 @@ bool GLXinit(Display *disp, Atom windele, Window *wnd, GLXContext *gc, bool *mul XSetWindowAttributes swa; swa.colormap = cmap; 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, vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa); @@ -336,6 +336,7 @@ int main() { unsigned long delta = 0; unsigned long frames = 0, tocks = 0; + unsigned input = 0; struct timeval tv; gettimeofday(&tv, NULL); @@ -353,11 +354,31 @@ int main() { case ClientMessage: if(static_cast(event.xclient.data.l[0]) == windele) 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; + game.setInput(input); game.run(delta); game.render(); -- cgit v1.2.3